2013-03-01 53 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