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