CSharpCodeProvider Performanța compilării

Este CompileAssemblyFromDom mai rapid decât CompileAssemblyFromSource ?

Este ar trebui să fie așa cum se presupune că ocolește front-ul compilatorului.

0
fr hi bn

2 răspunsuri

Am încercat să găsesc mai devreme apelul compilatorului și am renunțat. Sunt destul de multe straturi de interfețe și clase virtuale pentru răbdarea mea.

Nu cred că partea cititorului sursă al compilatorului se termină cu un copac DOM, dar intuitiv aș fi de acord cu tine. Munca necesară pentru a transforma DOM în IL ar trebui să fie mult mai mică decât citirea codului sursă C #.

0
adăugat

CompileAssemblyFromDom se compilează într-un fișier .cs care este apoi rulat prin compilatorul normal C #.

Exemplu:

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();
        }
    }
}

care afișează erori într-un fișier temp (acum inexistent) temp:

) - c: \ Documente și setări \ jacob \ Setări locale \ Temp \ x59n9yb-.0.cs: 17

     

; așteptat - c: \ Documents and Settings \ jacob \ Setări locale \ Temp \ x59n9yb-.0.cs: 17

     

Termeni de expresie nevalid ") - c: \ Documents and Settings \ jacob \ Setări locale \ Tem p \ x59n9yb-.0.cs: 17

Deci, cred că răspunsul este "nu"

0
adăugat
Absolut corect, deși dezamăgitor. CodeDOM este convertit în text C#, salvat într-un fișier temporar, și apoi este apelat compilatorul C# (care este dezvoltat în C ++). Nu știu dacă este cazul pentru Mono, dar din păcate CodeDOM-ul este de fapt mai lent decât scrisul C# direct.
adăugat autor David Pfeffer, sursa
Se presupune că csc.exe este rescris în C#, deci în viitor poate exista un mod gestionat care vă permite să treci un AST direct la compilator. Cu toate acestea, deoarece .NET 3.5 sta în prezent, în prezent nu există nicio modalitate de a ocoli frontendul compilatorului, în afară de a emite singur ansamblul IL sau bytecode.
adăugat autor Jacob Krall, sursa