2013-03-01 179 views
9

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

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

如果是这样,请你指点我一个例子。

我有效地尝试使用IL生成动态DLL,而是使用C#来做同样的事情。

编辑

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

这是我需要的一个例子。

+0

我不知道你需要的代码生成了点。你不能有两种类型:一种用于本地服务,另一种用于远程,并在运行时选择使用哪一种? – svick 2013-03-01 20:29:55

+0

当然,即使是连接正确委托的简单if语句。我只是将它作为一个简单的例子,在这种情况下动态会受益。我有更复杂的案例,我还没有完全制定出来。 – IamIC 2013-03-01 20:36:53

回答

4

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

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

你能告诉我一些东西,它显示了T4如何在运行时评估数据(自然是决定输出的数据)。 – IamIC 2013-03-01 19:47:33

+1

@IanC如果您创建运行时模板,它将在运行时进行评估(如我的代码示例中)。要修改模板的输入,可以例如使用“类功能控制块”中的属性,然后可以从模板访问该属性。 – svick 2013-03-01 20:04:44

+0

从@ ode2code http://odetocode.com/blogs/scott/archive/2011/01/04/preprocessed-t4-templates.aspx有一个很好的帖子,它展示了如何在部分类中添加一些简单的数据,这是许多人使用运行时模板的技术。 – GarethJ 2013-03-01 21:25:39