2009-03-02 10 views
28

Actuellement, du code est généré dynamiquement. En d'autres termes, un fichier C# .cs est créé dynamiquement par le programme, et l'intention est d'inclure ce fichier C# dans un autre projet. Le problème est que je voudrais générer un fichier .DLL au lieu de générer un fichier C# .cs afin qu'il puisse être référencé par n'importe quel type d'application .NET (pas seulement C#) et donc être plus utile.Génération de l'assembly DLL dynamiquement au moment de l'exécution

Répondre

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

Adapté de http://support.microsoft.com/kb/304655

+0

Note: les anciennes versions de ce code ont une ligne de code supplémentaire qui crée un compilateur du fournisseur en utilisant CSharpCodeProvider.CreateCompiler(). Ceci est obsolète, vous devriez appeler la compilation directement sur le fournisseur. –

3

En ce moment, votre meilleur pari est CSharpCodeProvider; les plans pour 4.0 incluent "compiler comme un service", ce qui rendra cela entièrement géré.

+0

le titre du sujet est "generate-dll-assembly-dynamically-at-run-time" PAS "générer-EXE-assembly-dynamiquement-at-run-time" votre description de lien abut créer exe à l'exécution. –

+1

@AminGhaderi et qui a dit quoi que ce soit sur exe? Si vous voulez dire "mais l'exemple de code sur MSDN crée un exe" - il créera aussi des DLLs avec plaisir; en fin de compte, le paquet de fichiers n'est * pas * la partie intéressante d'un assemblage –

28

La façon non dépréciée de le faire (en utilisant .NET 4.0 affiches précédentes mentionnées):

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 vous utilisez 'parameters.GenerateInMemory = true;' vous pouvez obtenir l'assemblage en mémoire avec 'r.CompiledAssembly' –

Questions connexes