在运行时动态生成 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 程序集的主要内容,如果未能解决你的问题,请参考以下文章

C#动态加载dll 时程序集的卸载问题

静态库 动态库 调用

.h头文件 .lib库文件 .dll动态链接库文件关系

CS.动态加载DLL.动态生成.运行代码.BS.AutoFac管理实现类

SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

Visual Studio 2010 建立了一个动态链接库,运行时提示无法启动dll