2008-08-07 10 views

Répondre

7

CompileAssemblyFromDom compile en un fichier .cs qui est ensuite exécuté dans le compilateur C# normal.

Exemple:

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

qui montre des erreurs dans un (maintenant inexistant) fichier temporaire:

) prévu - c: \ Documents and Settings \ jacob \ Local Settings \ Temp \ x59n9yb- .0.cs: 17

; attendu - c: \ Documents and Settings \ jacob \ Paramètres locaux \ Temp \ x59n9yb-.0.cs: 17

Terme d'expression invalide ')' - c: \ Documents and Settings \ jacob \ Paramètres locaux \ Tem p \ x59n9yb-.0.cs: 17

donc je suppose que la réponse est "non"

+0

Absolument correct, mais décevant. CodeDOM est converti en texte C#, enregistré dans un fichier temporaire, puis le compilateur C# (développé en C++) est appelé. Je ne sais pas si c'est le cas pour Mono, mais malheureusement le CodeDOM est en fait plus lent que l'écriture de C# directement. –

+0

Supposément csc.exe est en cours de réécriture en C#, donc dans le futur il peut y avoir un moyen géré qui vous permet de passer un AST directement au compilateur. Cependant, comme .NET 3.5 est maintenant, il n'y a actuellement aucun moyen de contourner l'interface du compilateur autrement que d'émettre l'assembly IL ou bytecode vous-même. –

0

J'ai essayé de trouver l'ultime appel du compilateur plus tôt et j'ai abandonné. Il y a un certain nombre de couches d'interfaces et de classes virtuelles pour ma patience.

Je ne pense pas que la partie lecteur source du compilateur se termine avec un arbre DOM, mais intuitivement, je serais d'accord avec vous. Le travail nécessaire pour transformer le DOM en IL devrait être beaucoup moins que de lire le code source C#.

Questions connexes