Динамическое создание сборки DLL во время выполнения
-
03-07-2019 - |
Вопрос
В настоящее время у меня есть код, который генерируется динамически.Другими словами, файл C# .cs создается программой динамически, и намерение состоит в том, чтобы включить этот файл C# в другой проект.
Проблема в том, что мне хотелось бы создать файл .DLL вместо создания файла C# .cs, чтобы на него можно было ссылаться из любого приложения .NET (не только C#) и, следовательно, быть более полезным.
Решение
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
Другие советы
Неустаревший способ сделать это (с использованием .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));
}
}
Прямо сейчас, ваш лучший выбор CSharpCodeProvider;в планы версии 4.0 входит «компилятор как услуга», что сделает это полностью управляемым.
Не связан с StackOverflow