Domanda

È CompilaAssemblyFromDom più veloce di CompilaAssemblyFromSource?

Esso Dovrebbe essere poiché presumibilmente ignora il front-end del compilatore.

È stato utile?

Soluzione

CompileAssemblyFromDom viene compilato in un file con estensione cs che viene quindi eseguito tramite il normale compilatore C#.

Esempio:

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

che mostra errori in un file temporaneo (ora inesistente):

) previsto - c:\Documents and Impostazioni\jacob\Impostazioni locali emp\x59n9yb-.0.cs:17

;previsto - c:\Documents and Settings\jacob\Local Settings emp\x59n9yb-.0.cs:17

Termine dell'espressione non valido ')' - c:\Documents and Impostazioni\jacob\Impostazioni locali emp p\x59n9yb-.0.cs:17

Quindi immagino che la risposta sia "no"

Altri suggerimenti

Ho provato a trovare la chiamata del compilatore definitiva in precedenza e ho rinunciato.C'è un certo numero di livelli di interfacce e classi virtuali per la mia pazienza.

Non penso che la parte del lettore sorgente del compilatore finisca con un albero DOM, ma intuitivamente sarei d'accordo con te.Il lavoro necessario per trasformare il DOM in IL dovrebbe essere molto inferiore alla lettura del codice sorgente C#.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top