【问题标题】:Generating DLL assembly dynamically at run time在运行时动态生成 DLL 程序集
【发布时间】:2010-10-10 21:49:23
【问题描述】:

目前我有一些动态生成的代码。也就是说,程序动态创建了一个 C# .cs 文件,目的是将这个 C# 文件包含在另一个项目中。

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

【问题讨论】:

    标签: c# .net dll code-generation


    【解决方案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;最终,文件包不是程序集的有趣部分
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多