2008-08-07 12 views

Respuesta

7

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

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 los errores en un (ahora inexistente) archivo temporal:

) espera - 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"

+0

absolutamente correcta, aunque decepcionante. CodeDOM se convierte en texto de C#, se guarda en un archivo temporal y luego se llama al compilador de C# (desarrollado en C++). No sé si este es el caso de Mono, pero lamentablemente el CodeDOM es en realidad más lento que escribir C# directamente. –

+0

Supuestamente, csc.exe se está reescribiendo en C#, por lo que en el futuro puede haber una manera administrada que le permita pasar un AST directamente al compilador. Sin embargo, como .NET 3.5 se encuentra ahora, actualmente no hay forma de eludir el frontend del compilador que no sea emitir el ensamblado IL o bytecode usted mismo. –

0

He intentado 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 lector de origen del compilador 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#.

Cuestiones relacionadas