Domanda

Attualmente ho del codice che viene generato dinamicamente. In altre parole, un file C # .cs viene creato dinamicamente dal programma e l'intenzione è quella di includere questo file C # in un altro progetto.

La sfida è che vorrei generare un file .DLL invece di generare un file C # .cs in modo che possa essere referenziato da qualsiasi tipo di applicazione .NET (non solo C #) e quindi essere più utile.

È stato utile?

Soluzione

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

Adattato da http://support.microsoft.com/kb/304655

Altri suggerimenti

Il modo non deprecato di farlo (usando .NET 4.0 come menzionato nei precedenti poster):

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

Al momento, la soluzione migliore è CSharpCodeProvider ; i piani per 4.0 includono "compilatore come servizio", che lo renderà completamente gestito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top