【问题标题】:Compiling dynamic code at runtime using T4 and C#使用 T4 和 C# 在运行时编译动态代码
【发布时间】:2013-02-16 07:42:28
【问题描述】:

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

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

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

我实际上是在尝试做与使用 IL 生成动态 dll 相同的事情,而不是使用 C#。

编辑

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

这是我需要的一个例子。

【问题讨论】:

  • 我不确定您是否需要为此生成代码。你不能有两种类型:一种用于本地服务,一种用于远程,并在运行时选择使用哪一种?
  • 当然,即使是连接正确委托的简单 if 语句。我只是将其用作 a 案例的简单示例,其中动态将受益。我还有更复杂的案例,我还没有完全规划出来。

标签: c# .net code-generation t4


【解决方案1】:

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

  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 如何在运行时评估数据(自然是决定输出的数据)的内容。
  • @IanC 如果您创建运行时模板,它将在运行时进行评估(就像在我的代码示例中一样)。要修改模板的输入,您可以例如使用“类功能控制块”中的属性,然后您可以从模板中访问。
  • @ode2code odetocode.com/blogs/scott/archive/2011/01/04/… 有一篇不错的帖子,它展示了如何在部分类中添加一些简单的数据,这是很多人喜欢使用运行时模板的技术。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2015-01-29
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多