与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]
前一陣子寫了不少關于代碼生成相關的文章,介紹了一些如何通過VS自動生成代碼的解決方案,比如CodeDOM、T4以及ASP.NET的BuildProvider等。現在將它們作一個匯總,給廣大讀者作一個參考。
[第1篇] 通過CodeDOM定義生成代碼的結構
我不知道大家對CodeDOM的代碼生成機制是否熟悉,但是有一點可以確定:如果你使用過Visual Studio,你就應該體驗過它帶給我們在編程上的便利。隨便列舉三種典型的代碼生成的場景:在創建強類型DataSet的時候,VS會自動根據Schema生成相應的C#或者VB.NET代碼;當我們編輯Resource文件的時候,相應的的后臺代碼也會自動生成;當我們通過添加Web Reference調用Web Service或者WCF Service的時候,VS會自動生成服務代理的代碼和相應的配置。總的來說,通過和VS集成的動態代碼生成工具使我們可以“強類型”的方式進行編程,進而提供我們的效率并減低錯誤的幾率。
CodeDOM 提供了表示許多常見的源代碼元素類型的類型。您可以設計一個生成源代碼模型的程序,使用CodeDOM 元素構成一個對象圖。而這個對象圖包含C#或者VB.NET代碼包含的基本元素:命名空間、類型、類型成員(方法、屬性、構造函數、事件等),并且包括方法實現的具體語句(Statement)。也就是說它的結構就是對一個具體.vb或者.cs文件代碼的反映。在這里我不會具體介紹CodeDOM體系結構……[閱讀全文]
[第2篇] 通過Visual Studio的Custom Tool定義代碼生成器
在《前篇》中我們已經通過CodeDOM的形式定義了將要生成的代碼結構,而這個CodeDOM對象就是CodeCompileUnit。CodeCompileUnit本身是與編程語言無關的,我們可以利用基于某種編程語言(VB.NET或者C#)的CodeDomProvider將CodeCompileUnit對象轉換成具體的代碼文本。為了讓我們的VS自動地為我們生成代碼,我們需要以Custom Tool的形式編寫相應的代碼生成器。我們編寫的代碼生成器最終通過COM組件的形式對外提供服務,所以其中涉及到COM組件的注冊。為了實現同VS的集成,還涉及到相應注冊表設置……[閱讀全文]
[第3篇] 不同于CodeDOM的代碼生成機制——T4
前面兩篇介紹了如何通過CodeDOM+Custom Tool的代碼生成方式實現了代碼的自動生成。實際上,我們最常用的代碼生成當時不是CodeDOM,而是T4,這是一個更為強大,并且適用范圍更廣的代碼生成技術。T4是對“Text Template Transformation Toolkit”(4個T)的簡稱。T4直接包含在VS2008和VS2010中,是一個基于文本文件轉換的工具包。T4的核心是一個基于“文本模板”的轉換引擎,我們可以通過它生成一切類型的文本型文件,比如我們常用的代碼文件類型包括:C#、VB.NET、T-SQL、XML甚至是配置文件等。
對于需要通過T4來進行代碼生成工作的我們來說,需要做的僅僅是根據轉換源(Transformation Source),比如數據表、XML等(由于例子簡單,HelloWord模板沒有輸入源)和目標文本(比如最終需要的C#或者T-SQL代碼等)定義相應的模板。T4模板作用就相當于進行XML轉化過程中使用的XSLT。
T4模板的定義非常簡單,整個模板的內容包括兩種形式:靜態形式和動態動態。前者就是直接寫在模板中作為原樣輸出的文本,后者是基于某種語言編寫代碼,T4引擎會動態執行它們。這和我們通過內聯的方式編寫的ASP.NET頁面很相似:HTML是靜態的,以C#或者VB.NET代碼便寫的動態執行的代碼通過相應的標簽內嵌其中。[閱讀全文]
[第4篇] 通過T4模板實現單文件的代碼生成
在《前一篇》中,我對T4模板的組成結構、語法,以及T4引擎的工作原理進行了大體的介紹,并且編寫了一個T4模板實現了如何將一個XML轉變成C#代碼。為了讓由此需求的讀者對T4有更深的了解,我們通過T4來做一些更加實際的事情——SQL Generator。在這里,我們可以通過SQL Generator為某個數據表自動生成進行插入、修改和刪除的存儲過程……[閱讀全文]
[第5篇] 通過T4模板實現多文件的代碼生成
在《前一篇》中我們通過T4模板為我們指定的數據表成功生成了我們需要的用于添加、修改和刪除操作的存儲過程。但是這是一種基于單個文件的解決方案,即我們必須為每一個生成的存儲過程建立一個模板。如果我們提供一種基于多文件的代碼生成方式,將會為編程人員帶來極大的便利。借助于T4 ToolBox這個開源工具箱,多文件的SQL Generator的實現變得異常簡單。[閱讀全文]
[第6篇] 解決T4模板的程序集引用的五種方案
如果你的T4模板需要調用一個自定義的類型,并且該類型定義在某個非系統程序集中,你就需要通過T4<#@ assembly…#>指令引用該程序集。在VS 2008環境下,你只需要為當前項目添加相應的程序集引用,并且通過<@ assembly…#>指令的name屬性指定程序集(Dll)的文件名即可。但是這種方式對于VS 2010則行不通,因為T4引擎在解析和編譯模板的時候并不會從項目引用列表中去定位目標程序集。本篇文章為你介紹在VS2010下5種不同的程序集引用的方式……[ 閱讀全文]
[第7篇] 編寫T4模板進行代碼生成無法避免的兩個話題:"Assembly Locking"&"Debug"
出于提高性能考慮,T4引擎在進行基于代碼生成的模板轉換(Template Transformation)的時候,會始終重用同一個AppDomain。由于該AppDomain不會自動卸載,這就會導致該AppDomain始終鎖定所有被它加載的程序集。如果我們需要釋放程序集,我們不得不重啟VS。但是,對于T4模板的開發調試階段,這種通過重新啟動VS的方式去釋放程序集以確保我們的項目能夠成功編譯是不能接受的。那么,是否有一種解決方案既能夠確保T4引擎能夠進行正常的模板轉換,又能避免它強行鎖定引用程序集呢?
VS和一些T4編輯器雖然給了基本的智能感知支持,但是在絕大部分我們相當于在編寫純文本的腳本,所以對于一些比較復雜的模板轉換邏輯,我們需要通過Debug的方式去發現一些無法避免的問題……[閱讀全文]
[第8篇] 通過自定義BuildProvider為ASP.NET提供代碼生成
對于ASP.NET應用的開發者來說,你可能不知道什么是BuildProvider,但是你幾乎無時無刻不在使用它所帶來的代碼生成機制。當你創建一個.aspx文件的時候,為什么會自動創建對應源代碼?當你在該.aspx頁面中以XML的方式添加一個按鈕,源代碼中為什么會自動添加一個同名的屬性。實際上,ASP.NET就是通過一個特殊的BuildProvider實現了將.aspx文件內容轉換成相應的源代碼,這個特殊的.aspx文件就是:PageBuildProvider。基于不同的文件類型,ASP.NET會采用不同的BuildProvider進行源代碼的生成。比如UserControlBuildProvider和MasterPageBuildProvider分別實現了基于用戶控件文件(.ascx)和母板頁(.master)的源代碼生成……[閱讀全文]
作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 原文鏈接
總結
以上是生活随笔為你收集整理的与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取请求客户端IP
- 下一篇: Python selenium环境搭建