11

我在 T4 上使用 TextTemplatingFilePreprocessor 阅读的文章展示了如何动态生成成为项目一部分并与项目一起编译的代码。

是否可以使用 T4 生成在运行时编译、输出到 dll 并加载和执行的代码,并且所述代码可以访问与 dll 相关的通常可见性功能?

如果是这样,请你给我举个例子。

我正在有效地尝试做与使用 IL 生成动态 dll 相同的事情,而是使用 C#。

编辑

我需要这个的具体情况很简单。我正在编写一个将消息路由到服务的消息路由器。服务可以是本地的或远程的。声明性脚本被编译成 C#。动态部分是“此服务是本地的还是远程的?”。输出 C# 相应更改。本地/远程的路由样式不同,因此具有动态性质。

这是我需要的一个例子。

4

1 回答 1

6

为此,您需要了解两件事:

  1. 您可以使用运行时 T4 模板在运行时生成一些文本,包括 C# 源代码。
  2. 您可以使用CSharpCodeProvider在运行时从文本编译程序集。或者您可以在生成的文本上手动运行 csc.exe(命令行 C# 编译器),但这会更复杂。(实际上CSharpCodeProvider在幕后就是这样做的。)

代码可能如下所示:

var template = new RuntimeTextTemplate();
string code = template.TransformText();

var compiler = new CSharpCodeProvider();
var result = compiler.CompileAssemblyFromSource(
    new CompilerParameters { OutputAssembly = "assembly.dll" }, code);
于 2013-03-01T19:10:33.523 回答