Actuellement, j'ai du code qui est généré de manière dynamique. En d'autres termes, un fichier C # .CS est créé de manière dynamique par le programme et l'intention est d'inclure ce fichier C # dans un autre projet.
Le défi est que je souhaite 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 (non seulement C #) et donc être plus utile.
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
La manière non obsolète de le faire (en utilisant .NET 4.0 comme des 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));
}
}
En ce moment, votre meilleur pari est CsharpCodeProvider ; Les plans pour 4.0 incluent "compilateur en tant que service", qui rendra cela entièrement géré.