mac - ide c# windows 7




Rendimiento de compilación de CSharpCodeProvider (2)

¿ CompileAssemblyFromDom es más rápido que CompileAssemblyFromSource ?

Debería ser porque presuntamente pasa por alto el front-end del compilador.


Intenté encontrar el último compilador antes y me di por vencido. Hay un buen número de capas de interfaces y clases virtuales para mi paciencia.

No creo que la parte del compilador de origen termine con un árbol DOM, pero intuitivamente estoy de acuerdo con usted. El trabajo necesario para transformar el DOM en IL debe ser mucho menor que leer el código fuente de C #.


CompileAssemblyFromDom 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("d");

            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: \ Documents and Settings \ jacob \ Configuración local \ Temp \ x59n9yb-.0.cs: 17

; esperado - c: \ Documents and Settings \ jacob \ Configuración local \ Temp \ x59n9yb-.0.cs: 17

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

Así que supongo que la respuesta es "no"





compiler-construction