在运行时使用T4和c#编译动态代码

本文关键字:编译 动态 代码 T4 运行时 | 更新日期: 2023-09-27 18:01:58

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

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

如果是的话,你能给我举个例子吗?

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

编辑

我需要它的具体情况很简单。我正在编写一个消息路由器,它将消息路由到服务。服务可以是本地的,也可以是远程的。声明性脚本被编译成c#。动态部分是"这个服务是本地的还是远程的?"c#的输出也随之改变。本地/远程的路由风格是不同的,因此是动态的。

在运行时使用T4和c#编译动态代码

要做到这一点,您需要知道两件事:

  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);