目前我有一些動態生成的代碼。換句話說,C#.cs文件是由程序動態創建的,其目的是將此C#文件包含在另一個項目中。在運行時動態生成DLL程序集
面臨的挑戰是我想生成一個.DLL文件,而不是生成一個C#.cs文件,以便它可以被任何類型的.NET應用程序(不僅僅是C#)引用,因此更有用。
目前我有一些動態生成的代碼。換句話說,C#.cs文件是由程序動態創建的,其目的是將此C#文件包含在另一個項目中。在運行時動態生成DLL程序集
面臨的挑戰是我想生成一個.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);
改編,最好的辦法是CSharpCodeProvider; 4.0的計劃包括「編譯器即服務」,這將使其得到充分管理。
主題的標題是「生成DLL-assembly-dynamic-at-run-time」NOT「生成-EXE-assembly-dynamic-at-run-time」您的鏈接描述在運行時創建EXE。 – 2015-04-01 08:30:28
@AminGhaderi和誰說的任何關於exe?如果你的意思是「但MSDN上的代碼示例創建了一個EXE」 - 它會很高興地創建DLL;最終,文件包不是程序集的有趣部分 – 2015-04-01 08:31:40
這樣做(使用.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.CreateCompiler()。這是不贊成的,你應該直接調用提供者上的編譯。 – 2017-12-28 22:21:49