可能經過很多博客的介紹,大家都知道代碼段的使用,使用代碼段可以很方便地生成一些常用的代碼格式,確實對我們開發很方便。在團隊開發中或者在某些情況下我們經常可能還會希望使用Visual Studio生成的代碼自動帶有一些信息,比如代碼文件的創建時間、代碼的說明及對命名空間的引用等等,實際上這個功能經周公證實在Visual Studio2005以上版本中就支持了。
下面以周公的本本的具體情況為例來加以說明,在周公的DELL 1425上系統是安裝在C盤,在系統盤下同時安裝了Visual Studio 2005和Visual Studio 2008兩套Visual Studio,並且安裝了正版的SQL Server 2005,因為系統盤經常在Windows XP和Windows 7之間切換並且還想在Windows XP和Windows 7之間共享某些個人配置,所以將我的文檔目錄設置到了系統最後的一個盤G盤上了,具體路徑為G:\My Documents,如果不做特別配置應為C:\Documents and Settings\zhoufoxcn\My Documents,這一點尤其注意。
這裡針對Visual Studio 2008來進行說明,首先我們打開C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE這個目錄(如果使用Visual Studio 2005則對應的路徑為C:\Program Files\Microsoft Visual Studio 8\Common7\IDE),可以看到如下的情況:
從上圖中可以看出ItemTemplates和ProjectTemplates文件夾被周公選中了,因為這個文件夾對我們有用。其中ItemTemplates文件中存放著我們向項目添加文件時的模板,ProjectTemplates文件夾顧名思義存放著我們創建項目的模板。這些文件夾中的模板分別會在我們創建文件或者項目時出現。
除了這些模板之外,Visual Studio在新建時還會搜索當前用戶的個人模板,在周公的本本上針對Visual Studio 2008的個人模板存放路徑為G:\My Documents\Visual Studio 2008\Templates(如果沒有經過這種這樣的特殊設置,這個路徑可能為C:\Documents and Settings\zhoufoxcn\My Documents\Visual Studio 2008\Templates,其中的zhoufoxcn為當前登錄系統的用戶名),打開這個文件夾,我們看到如下情況:
在沒有做任何配置的時候這兩個文件夾都是空的,在此時如果我們向項目中添加文件會看到這樣的情況,如下圖:
從上圖可以看出,我的模板是空的。
好了,下面周公將C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE下的ItemTemplates和ProjectTemplates文件夾拷貝到了當前個人配置文件夾G:\My Documents\Visual Studio 2008\Templates下(請注意你的電腦配置與我的電腦配置中路徑的對應關系),可能系統會提示是否覆蓋,點擊確認之後我們再在任何項目中創建新文件會看到下面的情況,如下圖所示:
此時我們可以看到我的模板下可以創建的新文件類型和系統的一摸一樣,如果此時我們選擇創建的話,生成的文件內容也會和系統模板的一樣。為了打造屬於我們個性的代碼,我們需要對我的模板進行改造。
舉例來說,假如我們要改變系統默認生成的代碼,想在創建代碼時自動添加一些信息,比如我們想讓默認生成的是public的,那麼可以按照下面的步驟做:
首先打開我的模板存放路徑,在周公這裡這個路徑是G:\My Documents\Visual Studio 2008\Templates\ItemTemplates(請注意你的可能與周公的不同),這個文件夾下存放的是包含VB.NET、C++及C#等新建項目的模板,如果我們要改變的是C#文件的,請繼續打開C#文件的創建模板,在周公本本上這個路徑為G:\My Documents\Visual Studio 2008\Templates\ItemTemplates\CSharp\Code\2052,在這個文件夾下有四個zip文件,名稱是Class.zip、CodeFile.zip、Interface.zip和NETCFv2-Class.zip,分別對應的是添加類、代碼文件、接口及.NET Compact Framework類的模板,在每個zip壓縮包裡都有一個.cs文件和一個.vstemplate文件。在這裡周公將Class.zip解壓出來,這時的class.cs文件代碼如下:
using System;
using System.Collections.Generic;
$if{$selection}nbsp;($targetframeworkversion{$selection}nbsp;== 3.5)using System.Linq;
$endif$using System.Text;
namespace $rootnamespace$
{
class $safeitemrootname$
{
}
}
將代碼更改如下:
using System;
using System.Collections.Generic;
$if{$selection}nbsp;($targetframeworkversion{$selection}nbsp;== 3.5)using System.Linq;
$endif$using System.Text;
namespace $rootnamespace$
{
/// <summary>
/// 作者:zhoufoxcn
/// 時間:$time$
/// 公司:$registeredorganization$
/// 版權:$year$-2012
/// CLR版本:$clrversion$
/// 博客地址:http://blog.csdn.net/zhoufoxcn
/// $safeitemrootname$說明:本代碼版權歸周公所有,使用時必須帶上周公博客地址
/// 唯一標識:$guid1$
/// </summary>
public class $safeitemrootname$
{
$safeitemrootname$()
{
}
}
}
保存class.cs,然後利用壓縮軟件將class.cs和剛剛從Class.zip中解壓出來Class.vstemplate文件壓縮為Class.zip文件(注意一定要壓縮成zip文件而不是rar或者其它格式文件,WinRAR提供這種功能),然後替換原來的Class.zip文件。
好了,現在我們可以檢驗我們的成果了。隨便打開一個項目,按照“添加”-“新建項”的步驟添加,在彈出的對話框中“我的模板”下選擇“類”(因為我們剛剛改的就是我的模板中添加的類的模板),這時Visual Studio 2008按照模板生成的代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WCFClient
{
/// <summary>
/// 作者:zhoufoxcn
/// 時間:2010-6-20 9:39:04
/// 公司:www.netskycn.com
/// 版權:2010-2012
/// CLR版本:2.0.50727.3603
/// 博客地址:http://blog.csdn.net/zhoufoxcn
/// Class1說明:本代碼版權歸周公所有,使用時必須帶上周公博客地址
/// 唯一標識:f5d4bfbe-accd-4d77-92b0-1407db616ae1
/// </summary>
public class Class1
{
Class1()
{
}
}
}
從上面的例子可以看出選擇我的模板的項就會按照預定好的格式生成代碼,如果我們對項目中的代碼有特殊格式要求的話,在這裡統一定制非常方便,至少周公以後會用這種模板來寫公布在博客上的代碼,因為周公注意到有很網站喜歡將別人博客上的文章中的鏈接信息和作者信息去掉,這事實上違反了作者的聲明。有時間的話我們可以針對每一個項更改出自己的模板。
上面我們僅僅演示了生成新文件的配置,其實我們還可以更改新生成項目的配置,按照前面的操作我們添加新項目時也有我的模板選項,如下圖所示:
不過即使從我的模板中選擇創建新項目也和系統中的項目一樣,因為沒有經過任何特殊配置。我們可以修改G:\My Documents\Visual Studio 2008\Templates\ProjectTemplates\CSharp下的項目模板,它們同樣也是一個zip文件,比如我們想要統一程序集信息,可以修改這個zip文件中的assemblyinfo.cs文件的內容,這樣就不用每次都手動去修改程序集信息了。
通過上面的步驟之後可以讓我們很方便地定制了添加新項或者新項目的模板,這在公司中團隊開發中還是相當有用的,也方便對代碼文件的格式的統一。
需要說明的是在編輯模板時會看到一個形如$time$、$rootnamespace$之類的東西,這些算是生成模板時用到的變量吧,在編輯模板時可以使用哪些變量微軟沒有官方的資料,不過周公留意了一下,大概有如下:
Itemname
safeitemname
sateitemrootname
projectname
safeprojectname
rootnamespace
guid[1-10]
time
year
username
userdomain
machinename
clrversion
targetframeworkversion
registeredorganization
wizarddata
可能有些人對上面的變量名不是太理解,其實是有規律的,都是一到幾個單詞的全稱,只不過沒有遵循我們平常所說的Camel和Pascal命名法則罷了(大家可以看的出不遵守命名法則確實難讀多了),知道這個規律之後這些變量的用途大家都能顧名思義了,如果確實不能也能根據最終生成的代碼推斷出它的用法的。此外,如果覺得每次都要從“我的模板下”選擇很麻煩的話,可以用更改後自定義模板替換系統中的模板。在剛剛編輯模板時我們還看到了一些簡單邏輯,比如當使用的項目.NET Framework版本為3.5時會自動使用System.Linq命名空間,我們還可以模范系統模板中的邏輯增加更多更符合個人或者公司需要的邏輯。