2009-03-02 16 views
28

Derzeit habe ich einige Code, der dynamisch generiert wird. Mit anderen Worten, eine C# .cs-Datei wird dynamisch vom Programm erstellt, und diese C# -Datei soll in ein anderes Projekt eingefügt werden.DLL-Assembly dynamisch zur Laufzeit generieren

Die Herausforderung besteht darin, dass ich eine .DLL-Datei generieren möchte, anstatt eine C# .cs-Datei zu generieren, so dass sie von jeder Art von .NET-Anwendung referenziert werden kann (und nicht nur C#).

Antwort

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

von http://support.microsoft.com/kb/304655 Angepasst Rechts

+0

Hinweis: ältere Versionen dieses Codes hat eine zusätzliche Codezeile, die einen Compiler vom Provider erstellen mit CSharpCodeProvider.CreateCompiler(). Dies ist veraltet, Sie sollten den Compiler direkt beim Provider aufrufen. –

3

jetzt, Ihre beste Wette ist CSharpCodeProvider; Die Pläne für 4.0 beinhalten "Compiler als Dienst", der dies vollständig verwaltet.

+0

Titel des Themas ist "Generieren-Dll-Assembly-dynamisch-zur Laufzeit" NOT "Generieren-EXE-Assembly-dynamisch-zur Laufzeit" Ihre Linkbeschreibung an create exe zur Laufzeit. –

+1

@AminGhaderi und wer sagte etwas über exe? Wenn Sie meinen "aber das Codebeispiel in MSDN erstellt eine EXE" - erstellt es auch gerne dlls; Letztlich ist das Dateipaket * nicht * der interessante Teil einer Assembly –

28

Die nicht veraltete Art und Weise, es zu tun (.NET 4.0 wie schon in früheren Bewertungen erwähnten verwendet wird):

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

Wenn Sie 'parameters.GenerateInMemory = true;' verwenden, können Sie die In-Memory-Assembly mit 'r.CompiledAssembly' abrufen –

Verwandte Themen