web-dev-qa-db-fra.com

Génération DLL Assemblée de manière dynamique au moment de l'exécution

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.

31
7wp
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

39
Rex M

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));
    }
}
32
Anssssss

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é.

4
Marc Gravell