Pregunta

Es compilarensamblajedesdedom más rápido que CompileAssemblyFromSource?

Él debería ser ya que presumiblemente pasa por alto la interfaz del compilador.

¿Fue útil?

Solución

CompileAssemblyFromDom se compila en un archivo .cs que luego se ejecuta a través del compilador normal de C#.

Ejemplo:

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

que muestra errores en un archivo temporal (ahora inexistente):

) esperado - c:\Documentos y configuraciones\jacob\Configuración local emp\x59n9yb-.0.cs:17

;esperado - c:\Documentos y configuraciones\jacob\Configuración local emp\x59n9yb-.0.cs:17

Término de expresión no válido ')' - c:\Documents and Settings\jacob\Local Settings emp\x59n9yb-.0.cs:17

Entonces supongo que la respuesta es "no".

Otros consejos

Intenté encontrar la llamada definitiva al compilador antes y me di por vencido.Hay bastantes capas de interfaces y clases virtuales para mi paciencia.

No creo que la parte del lector de código fuente del compilador termine con un árbol DOM, pero intuitivamente estaría de acuerdo contigo.El trabajo necesario para transformar DOM a IL debería ser mucho menor que leer el código fuente de C#.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top