2009-11-12 34 views
2

我推遲使用生成的代碼作爲構建過程的一部分,因爲害怕它在構建過程中引入的複雜性。簡單和實用的C#代碼生成(VS 2008或2010)

是否有一種簡單的方法將構建時生成的代碼集成到應用程序中?

那種代碼我想的是類似的資源和設置文件的Visual Studio執行代碼生成:

  • 有智能感知這裏是有價值
  • 有很多的屬性以及用於描述的屬性之間的鏈接,但不可能在C#中簡潔地實現。
  • 底層資源是可修改的,代碼自動重新生成,無需任何用戶交互,也無需理解生成器的內部結構。

對於(非真實世界)例如考慮生成的訪問經由類似命名的C#屬性(或方法)一個正則表達式的命名捕獲基團的預編譯。這是我想要生成的各種事情的典型代碼:樣板化包裝器的長片段,其主要功能是啓用編譯時檢查錯誤(在上面;訪問不存在的捕獲組或寫入和無效的正則表達式)不重要的是,這些屬性的智能感知。最後,這個設置應該可以被團隊上的其他人輕鬆使用,只有最少的學習曲線。即,要求手動干預來重新生成代碼是絕對不可接受的,也不能接受將生成的代碼提交到源代碼控制中。最糟糕的是,每個人都應該只需要安裝一些擴展;理想情況下,擴展應該可以安裝到源代碼樹中,以便任何檢出樹的人都可以在沒有任何介紹的情況下構建項目。

對於工作得很好,它的關鍵,將IDE集成是優秀的:更新底層的「資源」定義文件應觸發代碼的再生無需任何用戶交互,最好發電機本身便很容易以後爲其他開發人員維護(即發電機調試能力有一定優勢)。

最後,一種類似XSLT的方法,其中相同的模板可以應用於各種輸入資源是理想的;因爲這意味着如果你想要做的只是更新資源,並且因爲它使模板重用變得微不足道,你甚至不需要查看實際的生成器代碼。

我已經看過T4,但從我看到的這個有一個不太方便的類似於ASP的方法,其中模板和資源沒有乾淨地分割(即,生成器負責查找資源的 - 這使得模板重用變得不那麼容易)。

是否有更好的(更乾淨的)解決方案或運行T4的某種方式,使得相同的模板可以被平凡重用,並且(很像.NET設置文件),任何資源更新都會自動觸發重新實現碼?

摘要:(!不是模板) 我正在尋找一個代碼生成方式,可以自動

  1. 重新生成代碼,而無需開發干預時資源根本的變化。
  2. 維護起來有點簡單
  3. 能夠在幾個資源之間共享相同的生成器模板(其中,#1號點可能意味着資源應該引用生成器而不是反之亦然)。

回答

6

您可以使用T4 Toolbox的T4ScriptFileGenerator。將「資源」文件的「自定義工具」屬性更改爲T4ScriptFileGenerator並保存更改。自定義工具將生成一個新的空T4腳本(.tt文件)。將您的代碼生成邏輯放在這個.tt文件中。無論何時修改(並保存)資源文件,T4ScriptFileGenerator都將使用.tt文件生成輸出代碼。有關如何工作的示例,請參閱T4 Toolbox中的「LINQ to SQL Model」生成器,該工具箱使用.dbml文件作爲「資源」。在由該生成器創建的.tt文件中,您將看到所有的代碼生成邏輯位於單獨的.tt文件中,並在include指令的幫助下重複使用。

+0

謝謝,我一定會嘗試一下,看看它的效果如何! – 2009-11-12 14:49:25

0

您可能需要關注ABSE(http://www.abse.info)。 ABSE是一種代碼生成和模型驅動的軟件開發方法,在平臺和語言方面是完全不可知的,所以您不會在爲C#創建自己的生成器以及您希望的其他任何事情時遇到任何困難。最大的優點是您可以按照自己想要的方式生成代碼。缺點是你可能需要做更多的工作才能建立你的模板。

ABSE允許您將您的領域知識捕捉到「原子」中,這些原子基本上是可以構建的較大模型的碎片。 ABSE既是聲明式的,也是可執行的。該模型能夠按照您的規範生成代碼,並在模型級別結合自定義代碼。

遺憾的是,ABSE仍在進行中,集成開發環境(名爲AtomWeaver)仍在製作中。無論如何,發電機的CTP版本計劃於2010年1月發佈,所以我們已經接近它。