【发布时间】: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