2009-03-02 58 views
28

目前我有一些动态生成的代码。换句话说,C#.cs文件是由程序动态创建的,其目的是将此C#文件包含在另一个项目中。在运行时动态生成DLL程序集

面临的挑战是我想生成一个.DLL文件,而不是生成一个C#.cs文件,以便它可以被任何类型的.NET应用程序(不仅仅是C#)引用,因此更有用。

回答

37
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

+0

注:旧版本的代码中有一个额外的代码行中使用它创建从提供编译器CSharpCodeProvider.CreateCompiler()。这是不赞成的,你应该直接调用提供者上的编译。 – 2017-12-28 22:21:49

3

改编,最好的办法是CSharpCodeProvider; 4.0的计划包括“编译器即服务”,这将使其得到充分管理。

+0

主题的标题是“生成DLL-assembly-dynamic-at-run-time”NOT“生成-EXE-assembly-dynamic-at-run-time”您的链接描述在运行时创建EXE。 – 2015-04-01 08:30:28

+1

@AminGhaderi和谁说的任何关于exe?如果你的意思是“但MSDN上的代码示例创建了一个EXE” - 它会很高兴地创建DLL;最终,文件包不是程序集的有趣部分 – 2015-04-01 08:31:40

28

这样做(使用.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)); 
    } 
}