Динамическая генерация сборки DLL во время выполнения - PullRequest
31 голосов
/ 03 марта 2009

В настоящее время у меня есть код, который генерируется динамически. Другими словами, файл C # .cs создается программой динамически, и предполагается включить этот файл C # в другой проект.

Проблема в том, что я хотел бы создать файл .DLL вместо создания файла C # .cs, чтобы на него можно было ссылаться в любом приложении .NET (не только на C #), и, следовательно, он был бы более полезным.

Ответы [ 3 ]

39 голосов
/ 03 марта 2009
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);

Адаптировано с http://support.microsoft.com/kb/304655

31 голосов
/ 17 апреля 2012

Не осуждаемый способ сделать это (используя .NET 4.0, как упоминалось выше):

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));
    }
}
4 голосов
/ 03 марта 2009

Прямо сейчас, ваша лучшая ставка - CSharpCodeProvider ; в планах 4.0 - «компилятор как сервис», который сделает это полностью управляемым.

...