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

11
我阅读的关于使用TextTemplatingFilePreprocessor的T4文章展示了如何动态生成代码,使其成为项目的一部分,并与项目一起编译。
是否可以使用T4生成在运行时编译的代码,输出到dll中,并加载和执行该代码,并且该代码具有与dll相关的通常可见性能力?
如果可以,请给我指一个例子。
我实际上正在尝试做与使用IL生成动态dll相同的事情,但是使用C#。
编辑:
我需要这个特定案例很简单。我正在编写一个消息路由器,将消息路由到服务。服务可以是本地或远程的。声明性脚本被编译成C#。动态部分是“这个服务是本地的还是远程的?” 输出的C#会相应地改变。对于本地/远程,路由的样式不同,因此具有动态性。
这是我需要的一个例子。

我不确定你是否需要代码生成。你不能有两种类型:一种用于本地服务,另一种用于远程服务,并在运行时选择使用哪种类型吗? - svick
当然,即使是一个简单的if语句也可以连接正确的委托。我只是用这个作为一个简单的例子来说明动态类型会有好处。我还有更复杂的情况尚未完全映射出来。 - IamIC
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);

你能指导我一些关于T4如何在运行时评估数据的资料吗?(自然是决定输出的数据) - IamIC
1
@IanC 如果您创建一个运行时模板,它将在运行时进行评估(就像我的代码示例中一样)。要修改模板的输入,您可以例如使用“类特征控制块”中的属性,然后从模板中访问它们。 - svick
有一篇很好的文章来自@ode2code http://odetocode.com/blogs/scott/archive/2011/01/04/preprocessed-t4-templates.aspx,展示了如何在部分类中添加一些简单的数据,这是许多人在运行时模板中喜欢的技术。 - GarethJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接