【问题标题】:How to create at runtime a .NET exe file assembly from already compiled classes如何在运行时从已编译的类创建 .NET exe 文件程序集
【发布时间】:2014-08-18 08:58:30
【问题描述】:

我需要在运行时创建可执行文件程序集。我的主要目标是从执行编译任务的实际项目(.dll)中编译类型,而不使用字符串来保存需要编译到输出 exe 文件的代码。在代码开发/重构期间维护这些字符串将是一场噩梦。如下例所示,当我重构类 CodeToCompile 时,我还需要记住在 RuntimeCompiler.Compile() 方法中更改字符串 codeToCompile:

using System;
using System.CodeDom.Compiler;

using Microsoft.CSharp;

namespace RuntimeCompiler
{
    public class Compiler
    {
        public void Compile()
        {
            string codeToCompile = 
                @"public class CodeToCompile
                {
                    public static void Main(string[] args)
                    {
                        Console.ReadLine();
                    }
                }";

            CSharpCodeProvider codeProvider = new CSharpCodeProvider();
            ICodeCompiler icc = codeProvider.CreateCompiler();
            CompilerParameters parameters = new CompilerParameters
                                                {
                                                    GenerateExecutable = true,
                                                    OutputAssembly = "Generated.exe"
                                                };

            CompilerResults results = icc.CompileAssemblyFromSource(parameters, codeToCompile);
        }

    }

    public class CodeToCompile
    {
        public static void Main(string[] args)
        {
            Console.ReadLine();
        }
    }
}

我想要实现的是使用需要编译的代码更改字符串以引用需要编译为 .exe 程序集的类型。

string codeToCompile = "..."; //CodeToCompile source code
CompilerResults results = icc.CompileAssemblyFromSource(parameters, codeToCompile);

CompilerResults results = icc.CompileAssemblyFromSource(parameters, typeof(CodeToCompile));

有什么想法是实现这一目标的最佳方法吗?

我很容易找到如何使用 System.CodeDom.Compiler 命名空间从字符串动态编译 C# 代码的信息,如上所示。因此,任何将运行时对象的未编译代码作为字符串获取的方法都可以完成这项工作。我在这个方向上的研究没有给我解决方案,我强烈怀疑是否有可能以简单的方式完成。

我的第二个想法是使用机制将编译类型从正在运行的程序集中“移动”到新创建的程序集,但不幸的是我还没有找到任何解决方案来完成这项任务。

【问题讨论】:

  • 你能澄清一下吗:without using strings keeping the code that needs to be compiled to output exe file.
  • 如果您需要与代码分开的字符串,请使用某种资源
  • @Stefan:我已经包含了代码示例以进行澄清。
  • 你不能只使用StreamReader.cs 文件读入字符串吗?
  • 我必须说,也许您正试图用一个相当复杂的解决方案来解决一个相对简单的问题。您需要在运行时编译代码的原因是什么?

标签: c# .net compilation .net-assembly


【解决方案1】:

...不使用字符串保存需要编译输出exe文件的代码。在代码开发/重构期间维护这些字符串将是一场噩梦......

我的建议是查看.NET Globalization

全球化涉及设计和开发一个面向世界的应用程序,该应用程序支持为多种文化的用户提供本地化界面和区域数据......字符和字符串的处理是全球化的核心焦点,因为每个文化或地区可能使用不同的字符和字符集,并对它们进行不同的排序。 More...

CodeDom.Compiler 的替代方案是 .NET 的 Reflection Emit

...System.Reflection.Emit 命名空间允许编译器或工具在运行时发出元数据和 Microsoft 中间语言 (MSIL),并可选择在磁盘上生成可移植可执行 (PE) 文件。脚本引擎和编译器是这个命名空间的主要用户。 More...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多