2009-03-02 20 views
28

Actualmente tengo un código que se genera dinámicamente. En otras palabras, el programa crea dinámicamente un archivo .cs de C#, y la intención es incluir este archivo C# en otro proyecto.Generación de ensamblado de DLL dinámicamente en tiempo de ejecución

El reto es que me gustaría generar un archivo .DLL en lugar de generar un archivo C# .cs para que pueda ser referenciado por cualquier tipo de aplicación .NET (no solo C#) y por lo tanto ser más útil.

Respuesta

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

Adaptado de http://support.microsoft.com/kb/304655

+0

Nota: Las versiones anteriores de este código tiene una línea adicional de código que crear un compilador del proveedor usando CSharpCodeProvider.CreateCompiler(). Esto está en desuso, debe llamar a compilar en el proveedor directamente. –

3

En este momento, la mejor opción es CSharpCodeProvider; los planes para 4.0 incluyen "compilador como servicio", lo que hará que esto se gestione por completo.

+0

título del tema es "generate-dll-assembly-dynamically-at-run-time" NOT "generate-EXE-assembly-dynamically-at-run-time" la descripción de su enlace abut create exe en tiempo de ejecución. –

+1

@AminGhaderi y ¿quién dijo algo sobre exe? Si quiere decir "pero el ejemplo de código en MSDN crea un exe", con gusto creará también dlls; finalmente, el paquete de archivos es * no * la parte interesante de un ensamblaje –

28

La forma no obsoleto de hacerlo (utilizando .NET 4.0 como críticos anteriores mencionados):

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

Si usa 'parameters.GenerateInMemory = true;' puede obtener el ensamblaje en memoria con 'r.CompiledAssembly' –

Cuestiones relacionadas