產生新專案︰深入探討,第一部分
有沒有想過如何建立自己的專案類型? 想知道當您建立新專案時,實際會發生什麼事? 讓我們深入了解到底發生了什麼事。
Visual Studio 會為您協調多項工作:
它會顯示所有可用專案類型的樹狀結構。
它會顯示每個專案類型的應用程式範本清單,供您挑選。
它會收集應用程式的專案資訊,例如:專案名稱和路徑。
它會將此資訊傳遞給專案 Factory 。
它會在目前方案中產生專案項目和資料夾。
新專案對話方塊
當您選取新專案的專案類型時,這一切就開始了。 讓我們從按一下 [檔案] 功能表中的 [新增專案] 開始。 [新增專案] 對話方塊隨即出現,如下所示:
讓我們進一步了解。 [專案類型] 樹狀目錄會列出您可以建立的各種專案類型。 當您選取類似 Visual C# Windows 的專案類型時,您將看到一個可協助您入門的應用程式範本清單。 Visual Studio 安裝的範本是由 Visual Studio 所安裝,可供電腦的任何使用者使用。 您建立或收集的新範本可以新增至 [我的範本],並且僅供您使用。
當您選取 Windows 應用程式之類的範本時,對話方塊中會出現應用程式類型的描述;在本案例中,建立具有 Windows 使用者介面的應用程式專案。
在 [新增專案] 對話方塊底部,您會看到多個可收集詳細資訊的控制項。 因專案類型不同,您看到的控制項也會不同,但一般而言,它們包含專案 [名稱] 文字輸入框、[位置] 文字輸入框和相關 [瀏覽] 按鈕,以及 [方案名稱] 文字輸入框和相關 [建立方案的目錄] 核取方塊。
填入 [新增專案] 對話方塊
[新增專案] 對話方塊從哪裡取得資訊? 共有兩種機制,其中一個機制已停用。 [新增專案] 對話方塊合併顯示從兩種機制獲得的資訊。
較舊的 (已淘汰) 方法會使用系統登錄項目和 .vsdir 檔案。 這種機制會在 Visual Studio 開啟時執行。 較新的方法會使用 .vstemplate 檔案。 這種機制會在 Visual Studio 初始化時執行,例如:執行時
devenv /setup
或
devenv /installvstemplates
專案類型
專案類型根節點的位置和名稱 (例如:Visual C# 和其他語言) 是由系統登錄項目所決定。 子節點的組織 (例如:Database 和 Smart Device) 反映包含對應 .vstemplate 檔案的資料夾階層。 讓我們先看看根節點。
專案類型根節點
初始化 Visual Studio 時,它會周遊系統登錄機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs 的子機碼來建置並命名 [專案類型] 樹狀結構的根節點。 快取此資訊以供之後使用。 查看 TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1 機碼。 每個項目都是 VSPackage GUID。 會忽略子機碼 (/1) 的名稱,但它的存在表示這是 [專案類型] 根節點。 根節點可能會有多個子機碼,可控制其在 [專案類型] 樹狀結構中的外觀。 讓我們看看其中的一些。
(預設值)
這是命名根節點之當地語系化字串的資源識別碼。 字串資源位於 VSPackage GUID 所選取的附屬 DLL 中。
在此範例中,VSPackage GUID 為
{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}
且根節點 (/1) 的資源識別碼 (預設值) 為 #2345
如果您在附近的 Packages 機碼中查閱 GUID 並檢查 SatelliteDll 子機碼,則可以找到包含字串資源之組件的路徑:
<Visual Studio 安裝路徑>\VC#\VCSPackages\1033\csprojui.dll
若要確認這一點,請開啟 [檔案總管],並將 csprojui.dll 拖曳至 Visual Studio 目錄。 字串資料表顯示資源 #2345 的標題為 Visual C#。
SortPriority
這會決定專案類型樹狀結構中根節點的位置。
SortPriority REG_DWORD 0x00000014 (20)
優先順序數字越小,在樹狀結構中的位置就越高。
DeveloperActivity
如果此子機碼存在,則根節點的位置由 [開發人員設定] 對話方塊所控制。 例如,
DeveloperActivity REG_SZ VC#
表示如果將 Visual Studio 設定為 Visual C++ 開發,則 Visual C# 將是根節點。 否則,它會是其他語言的子節點。
Folder
如果這個子機碼存在,則根節點會變成指定資料夾的子節點。 機碼底下將顯示可能的資料夾清單
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders
例如,資料庫專案項目有一個資料夾機碼,符合 PseudoFolders 中的其他專案類型項目。 因此,在 [專案類型] 樹狀結構中,[資料庫專案] 將會是 [其他專案類型] 的子節點。
專案類型子節點和 .vstdir 檔案
專案類型樹狀結構中子節點的位置會遵循 ProjectTemplates 資料夾中資料夾的階層。 對於機器範本 (Visual Studio 安裝的範本),常見的位置為 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\,而對於使用者範本 (我的範本),常見的位置為 \My Documents\Visual Studio 14.0\Templates\ProjectTemplates\。 這兩個位置的資料夾階層會合併以建立專案類型樹狀結構。
對於具有 C# 開發人員設定的 Visual Studio,[專案類型] 樹狀結構,如下所示:
對應的 ProjectTemplates 資料夾如下所示:
當 [新增專案] 對話方塊開啟時,Visual Studio 會周遊 ProjectTemplates 資料夾,以及在 [專案類型] 樹狀結構中重新建立其結構,並進行一些變更:
[專案類型] 樹狀結構中的根節點是由應用程式範本所決定。
節點名稱可以當地語系化,而且可以包含特殊字元。
排序順序可以更改。
尋找專案類型的根節點
當 Visual Studio 周遊 ProjectTemplates 資料夾時,它會開啟所有 .zip 檔案,並擷取任何 .vstemplate 檔案。 .vstemplate 檔案使用 XML 來描述應用程式範本。 如需詳細資訊,請參閱產生新專案:深入探討,第二部分。
<ProjectType> 標籤會決定應用程式的專案類型。 例如,\CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip 檔案包含具有此標籤的 EmptyProject.vstemplate 檔案:
<ProjectType>CSharp</ProjectType>
<ProjectType> 標籤 (而不是 ProjectTemplates 資料夾中的子資料夾) 會決定專案類型樹狀結構中的應用程式根節點。 在範例中,Windows CE 應用程式會出現在 Visual C# 根節點底下,即使將 WindowsCE 資料夾移至 VisualBasic 資料夾,Windows CE 應用程式仍會出現在 Visual C# 根節點底下。
當地語系化節點名稱
當 Visual Studio 周遊 ProjectTemplates 資料夾時,它會檢查找到的任何 .vstdir 檔案。 .vstdir 檔案是 XML 檔案,可控制 [新增專案] 對話方塊中專案類型的外觀。 在 .vstdir 檔案中,使用 <LocalizedName> 標籤來命名專案類型節點。
例如,\CSharp\Database\TemplateIndex.vstdir 檔案包含此標籤:
<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>
這決定命名根節點之當地語系化字串的附屬 DLL 和資源識別碼,在此案例中為 Database。 當地語系化名稱可以包含不適用於資料夾名稱的特殊字元,例如 .NET。
如果沒有 <LocalizedName> 標籤,專案類型會由資料夾本身命名,SmartPhone2003。
尋找專案類型的排序順序
為了判斷專案類型的排序順序,.vstdir 檔案會使用 <SortOrder> 標籤。
例如,\CSharp\Windows\Windows.vstdir 檔案包含此標籤:
<SortOrder>5</SortOrder>
\CSharp\Database\TemplateIndex.vstdir 檔案具有較大值的標籤:
<SortOrder>5000</SortOrder>
<SortOrder> 標籤中的數字越小,在樹狀結構中的位置越高,因此 Windows 節點在 [專案類型]樹狀結構 中看起來高於 Database。
如果沒有為專案類型指定 <SortOrder> 標籤,則它將按字母順序顯示在包含 <SortOrder> 規格的任何專案類型之後。
請注意,「我的文件」(我的範本) 資料夾中沒有 .vstdir 檔案。 使用者應用程式專案類型名稱不會當地語系化,並以字母順序顯示。
快速檢閱
讓我們修改 [新增專案] 對話方塊,並建立新的使用者專案範本。
將 MyProjectNode 子資料夾新增至 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp 資料夾。
使用任何文字編輯器,在 MyProjectNode 資料夾中建立 MyProject.vstdir 檔案。
將這幾行新增至 .vstdir 檔案:
<TemplateDir Version="1.0.0"> <SortOrder>6</SortOrder> </TemplateDir>
儲存並關閉 .vstdir 檔案。
使用任何文字編輯器,在 MyProjectNode 資料夾中建立 MyProject.vstemplate 檔案。
將這幾行新增至 .vstemplate 檔案:
<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <ProjectType>CSharp</ProjectType> </TemplateData> </VSTemplate>
儲存 .vstemplate 檔案並關閉編輯器。
將 .vstemplate 檔案傳送至新的壓縮 MyProjectNode\MyProject.zip 資料夾。
在 Visual Studio 命令視窗中,輸入:
devenv /installvstemplates
開啟 Visual Studio。
開啟 [新增專案] 對話方塊,然後展開 [Visual C#] 專案節點。
MyProjectNode 顯示為 Visual C# 的子節點,位於 Windows 節點底下。