共用方式為


產生新專案︰深入探討,第一部分

有沒有想過如何建立自己的專案類型? 想知道當您建立新專案時,實際會發生什麼事? 讓我們深入了解到底發生了什麼事。

Visual Studio 會為您協調多項工作:

  • 它會顯示所有可用專案類型的樹狀結構。

  • 它會顯示每個專案類型的應用程式範本清單,供您挑選。

  • 它會收集應用程式的專案資訊,例如:專案名稱和路徑。

  • 它會將此資訊傳遞給專案 Factory 。

  • 它會在目前方案中產生專案項目和資料夾。

新專案對話方塊

當您選取新專案的專案類型時,這一切就開始了。 讓我們從按一下 [檔案] 功能表中的 [新增專案] 開始。 [新增專案] 對話方塊隨即出現,如下所示:

Screenshot of the New Project dialog box.

讓我們進一步了解。 [專案類型] 樹狀目錄會列出您可以建立的各種專案類型。 當您選取類似 Visual C# Windows 的專案類型時,您將看到一個可協助您入門的應用程式範本清單。 Visual Studio 安裝的範本是由 Visual Studio 所安裝,可供電腦的任何使用者使用。 您建立或收集的新範本可以新增至 [我的範本],並且僅供您使用。

當您選取 Windows 應用程式之類的範本時,對話方塊中會出現應用程式類型的描述;在本案例中,建立具有 Windows 使用者介面的應用程式專案

在 [新增專案] 對話方塊底部,您會看到多個可收集詳細資訊的控制項。 因專案類型不同,您看到的控制項也會不同,但一般而言,它們包含專案 [名稱] 文字輸入框、[位置] 文字輸入框和相關 [瀏覽] 按鈕,以及 [方案名稱] 文字輸入框和相關 [建立方案的目錄] 核取方塊。

填入 [新增專案] 對話方塊

[新增專案] 對話方塊從哪裡取得資訊? 共有兩種機制,其中一個機制已停用。 [新增專案] 對話方塊合併顯示從兩種機制獲得的資訊。

較舊的 (已淘汰) 方法會使用系統登錄項目和 .vsdir 檔案。 這種機制會在 Visual Studio 開啟時執行。 較新的方法會使用 .vstemplate 檔案。 這種機制會在 Visual Studio 初始化時執行,例如:執行時

devenv /setup

devenv /installvstemplates

專案類型

專案類型根節點的位置和名稱 (例如:Visual C#其他語言) 是由系統登錄項目所決定。 子節點的組織 (例如:DatabaseSmart 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,[專案類型] 樹狀結構,如下所示:

Screenshot of the Project types folder tree in Visual Studio with C# developer settings.

對應的 ProjectTemplates 資料夾如下所示:

Screenshot of the Project Templates folder tree in Visual Studio with C# developer settings.

當 [新增專案] 對話方塊開啟時,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 檔案。 使用者應用程式專案類型名稱不會當地語系化,並以字母順序顯示。

快速檢閱

讓我們修改 [新增專案] 對話方塊,並建立新的使用者專案範本。

  1. 將 MyProjectNode 子資料夾新增至 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp 資料夾。

  2. 使用任何文字編輯器,在 MyProjectNode 資料夾中建立 MyProject.vstdir 檔案。

  3. 將這幾行新增至 .vstdir 檔案:

    <TemplateDir Version="1.0.0">
        <SortOrder>6</SortOrder>
    </TemplateDir>
    
  4. 儲存並關閉 .vstdir 檔案。

  5. 使用任何文字編輯器,在 MyProjectNode 資料夾中建立 MyProject.vstemplate 檔案。

  6. 將這幾行新增至 .vstemplate 檔案:

    <VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
        <TemplateData>
            <ProjectType>CSharp</ProjectType>
        </TemplateData>
    </VSTemplate>
    
  7. 儲存 .vstemplate 檔案並關閉編輯器。

  8. 將 .vstemplate 檔案傳送至新的壓縮 MyProjectNode\MyProject.zip 資料夾。

  9. 在 Visual Studio 命令視窗中,輸入:

    devenv /installvstemplates
    

    開啟 Visual Studio。

  10. 開啟 [新增專案] 對話方塊,然後展開 [Visual C#] 專案節點。

    Screenshot of the Project types folder tree in the New Project dialog box with MyProjectNode highlighted under the expanded Visual C# project node.

    MyProjectNode 顯示為 Visual C# 的子節點,位於 Windows 節點底下。