在运行时动态生成 DLL 程序集
Posted
技术标签:
【中文标题】在运行时动态生成 DLL 程序集【英文标题】:Generating DLL assembly dynamically at run time 【发布时间】:2010-10-10 21:49:23 【问题描述】:目前我有一些动态生成的代码。也就是说,程序动态创建了一个 C# .cs 文件,目的是将这个 C# 文件包含在另一个项目中。
挑战在于我想生成一个 .DLL 文件而不是生成一个 C# .cs 文件,以便它可以被任何类型的 .NET 应用程序(不仅是 C#)引用,因此更有用。
【问题讨论】:
【参考方案1】: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
【讨论】:
注意:此代码的旧版本有一行额外的代码,它使用 CSharpCodeProvider.CreateCompiler() 从提供程序创建编译器。这已被弃用,您应该直接在提供程序上调用 compile。【参考方案2】:不推荐使用的方法(使用 .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));
【讨论】:
如果你使用parameters.GenerateInMemory = true;
,你可以使用r.CompiledAssembly
获得内存中的程序集【参考方案3】:
现在,您最好的选择是CSharpCodeProvider; 4.0 的计划包括“编译器即服务”,这将使其完全托管。
【讨论】:
主题的标题是“generating-dll-assembly-dynamically-at-run-time”而不是“generating-EXE-assembly-dynamically-at-run-time”您的链接描述在创建 exe运行时。 @AminGhaderi 和谁对 exe 说了什么?如果你的意思是“但是 MSDN 上的代码示例创建了一个 exe”——它也会很高兴地创建 dll;最终,文件包不是程序集的有趣部分以上是关于在运行时动态生成 DLL 程序集的主要内容,如果未能解决你的问题,请参考以下文章
CS.动态加载DLL.动态生成.运行代码.BS.AutoFac管理实现类
SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。