如何在运行时从已编译的类创建. net exe文件程序集

本文关键字:创建 net exe 程序集 文件 编译 运行时 | 更新日期: 2023-09-27 18:18:31

我需要在运行时创建可执行文件程序集。我的主要目标是从执行编译任务的实际项目(.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#代码的信息,如上所示。因此,任何将运行时对象未编译代码作为字符串获取的方法都可以完成这项工作。我在这个方向上的研究并没有给我答案,我强烈怀疑是否有简单的方法可以做到。

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

如何在运行时从已编译的类创建. net exe文件程序集

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

我的建议是看看。net全球化

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

CodeDom的替代方案。编译器是。net的反射Emit:

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

更多…