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

时间:2013-03-01 17:56:09

标签: c# .net code-generation t4

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

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

如果是的话,请你指点一个例子。

我正在尝试使用IL生成动态dll,而不是使用C#。

修改

我需要的具体案例很简单。我正在编写一个消息路由器,用于将消息路由到服务。服务可以是本地的或远程的。声明性脚本编译为C#。动态部分是“这项服务是本地还是远程服务?”。输出C#相应地改变。本地/远程的路由风格不同,因此具有动态性。

这是我需要的一个例子。

1 个答案:

答案 0 :(得分:4)

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

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

    var template = new RuntimeTextTemplate();
    string code = template.TransformText();
    
    var compiler = new CSharpCodeProvider();
    var result = compiler.CompileAssemblyFromSource(
        new CompilerParameters { OutputAssembly = "assembly.dll" }, code);