2009-03-02 14 views
28

Attualmente ho del codice che viene generato dinamicamente. In altre parole, un file C# .cs viene creato dinamicamente dal programma e l'intenzione è quella di includere questo file C# in un altro progetto.Generazione dinamica dell'assembly DLL in fase di esecuzione

La sfida è che vorrei generare un file DLL invece di generare un file C# cs in modo che potesse essere referenziato da qualsiasi tipo di applicazione .NET (non solo C#) e, pertanto, essere più utile.

risposta

37
using System.CodeDom.Compiler; 
using System.Diagnostics; 
using Microsoft.CSharp; 

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
parameters.OutputAssembly = "AutoGen.dll"; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters, yourCodeAsString); 

adattati da http://support.microsoft.com/kb/304655

+0

Nota: le vecchie versioni di questo codice disporre di una linea supplementare di codice che creano un compilatore dal provider tramite CSharpCodeProvider.CreateCompiler(). Questo è deprecato, dovresti chiamare direttamente sul provider. –

3

In questo momento, la cosa migliore è CSharpCodeProvider; i piani per la 4.0 includono "compilatore come servizio", che lo renderà completamente gestito.

+0

Il titolo dell'argomento è "generare-dll-assembly-dynamically-at-run-time" NON "generare-EXE-assembly-dynamically-at-run-time" la descrizione del collegamento deve creare exe in fase di esecuzione. –

+1

@AminGhaderi e chi ha parlato di exe? Se intendi "ma l'esempio di codice su MSDN crea un exe" - creerà felicemente anche le DLL; in definitiva, il pacchetto file è * non * la parte interessante di un assembly –

28

Il modo non deprecato di farlo (usando .NET 4.0 come nelle precedenti citati):

using System.CodeDom.Compiler; 
using System.Reflection; 
using System; 
public class J 
{ 
    public static void Main() 
    {  
     System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
     parameters.GenerateExecutable = false; 
     parameters.OutputAssembly = "AutoGen.dll"; 

     CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, "public class B {public static int k=7;}"); 

     //verify generation 
     Console.WriteLine(Assembly.LoadFrom("AutoGen.dll").GetType("B").GetField("k").GetValue(null)); 
    } 
} 
+0

Se si utilizza 'parameters.GenerateInMemory = true;' è possibile ottenere l'assembly in memoria con 'r.CompiledAssembly'. –

Problemi correlati