CSharpCodeProvider संकलन प्रदर्शन

CompileAssemblyFromDom CompileAssemblyFromSource से तेज़ है?

यह होना चाहिए जैसा कि संभवतः यह कंपाइलर फ्रंट-एंड को बाईपास करता है।

0
ro fr bn

2 उत्तर

मैंने पहले अंतिम कंपाइलर कॉल खोजने की कोशिश की है और मैंने छोड़ दिया है। मेरे धैर्य के लिए इंटरफेस और आभासी कक्षाओं की कई परतें हैं।

मुझे नहीं लगता कि कंपाइलर का स्रोत रीडर हिस्सा एक डोम पेड़ के साथ समाप्त होता है, लेकिन सहजता से मैं आपके साथ सहमत हूं। डीओएम को आईएल में बदलने के लिए जरूरी काम सी # स्रोत कोड पढ़ने से बहुत कम होना चाहिए।

0
जोड़ा

CompileAssemblyFromDom एक .cs फ़ाइल में संकलित करता है जिसे तब सामान्य सी # कंपाइलर के माध्यम से चलाया जाता है।

उदाहरण:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom;
using System.IO;
using System.CodeDom.Compiler;
using System.Reflection;

namespace CodeDomQuestion
{
    class Program
    {

        private static void Main(string[] args)
        {
            Program p = new Program();
            p.dotest("C:\\fs.exe");
        }

        public void dotest(string outputname)
        {
            CSharpCodeProvider cscProvider = new CSharpCodeProvider();
            CompilerParameters cp = new CompilerParameters();
            cp.MainClass = null;
            cp.GenerateExecutable = true;
            cp.OutputAssembly = outputname;

            CodeNamespace ns = new CodeNamespace("StackOverflowd");

            CodeTypeDeclaration type = new CodeTypeDeclaration();
            type.IsClass = true;
            type.Name = "MainClass";
            type.TypeAttributes = TypeAttributes.Public;

            ns.Types.Add(type);

            CodeMemberMethod cmm = new CodeMemberMethod();
            cmm.Attributes = MemberAttributes.Static;
            cmm.Name = "Main";
            cmm.Statements.Add(new CodeSnippetExpression("System.Console.WriteLine('f'zxcvv)"));
            type.Members.Add(cmm);

            CodeCompileUnit ccu = new CodeCompileUnit();
            ccu.Namespaces.Add(ns);

            CompilerResults results = cscProvider.CompileAssemblyFromDom(cp, ccu);

            foreach (CompilerError err in results.Errors)
                Console.WriteLine(err.ErrorText + " - " + err.FileName + ":" + err.Line);

            Console.WriteLine();
        }
    }
}

जो एक (अब nonexistent) temp फ़ाइल में त्रुटियों को दिखाता है:

) अपेक्षित - सी: \ दस्तावेज़ और सेटिंग्स \ jacob \ स्थानीय सेटिंग्स \ Temp \ x59n9yb-.0.cs: 17

     

; अपेक्षित - सी: \ दस्तावेज़ और सेटिंग्स \ jacob \ स्थानीय सेटिंग्स \ Temp \ x59n9yb-.0.cs: 17

     

अमान्य अभिव्यक्ति शब्द ')' - c: \ दस्तावेज़ और सेटिंग्स \ jacob \ स्थानीय सेटिंग्स \ Tem p \ x59n9yb-.0.cs: 17

तो मुझे लगता है कि जवाब "नहीं" है

0
जोड़ा
निराशाजनक यद्यपि बिल्कुल सही है। कोडडॉम को सी # टेक्स्ट में परिवर्तित किया गया है, जो एक अस्थायी फ़ाइल में सहेजा गया है, और फिर सी # कंपाइलर (जिसे सी ++ में विकसित किया गया है) कहा जाता है। मुझे नहीं पता कि यह मोनो का मामला है, लेकिन दुख की बात है कि कोडडॉम वास्तव में सी # लिखने से धीमा है।
जोड़ा लेखक David Pfeffer, स्रोत
माना जाता है कि csc.exe को सी # में फिर से लिखा जा रहा है, इसलिए भविष्य में एक प्रबंधित तरीका हो सकता है जो आपको एएसटी को सीधे कंपाइलर को पास करने देता है। हालांकि, जैसा कि .NET 3.5 अभी खड़ा है, वर्तमान में आईएल असेंबली या बाइटकोड को उत्सर्जित करने के अलावा कंपाइलर फ्रंटएंड को बाईपास करने का कोई तरीका नहीं है।
जोड़ा लेखक Jacob Krall, स्रोत