建立基本專案系統,第 2 部分
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
本系列的第一個逐步解說建立基本專案系統,第 1 部分,示範如何建立基本專案系統。 此逐步解說建立基本專案系統上加入 Visual Studio 範本、 屬性頁和其他功能。 您必須先完成第一個逐步解說,才能啟動這一個。
這個逐步解說示範如何建立具有專案檔案名稱副檔名.myproj 的專案類型。 若要完成本逐步解說,您不需要建立自己的語言,因為本逐步解說借用現有的 Visual C# 專案系統。
這個逐步解說示範如何完成這些工作︰
建立 Visual Studio 範本。
部署 Visual Studio 範本。
建立專案類型的子節點中新的專案對話方塊。
可讓 Visual Studio 範本中的參數替代。
建立專案屬性頁。
注意
在本逐步解說的步驟是以 C# 專案為基礎。 不過,除了副檔名的檔案和程式碼等特性,您可以使用相同的步驟是 Visual Basic 專案。
建立 Visual Studio 範本
建立基本專案系統,第 1 部分示範如何建立基本專案範本,並將它加入至專案系統。 它也示範如何使用此範本註冊使用 Visual Studio ProvideProjectFactoryAttribute \Templates\Projects\SimpleProject\ 資料夾的完整路徑寫入系統登錄中的屬性。
藉由使用 Visual Studio 範本 (.vstemplate 檔案),而不基本的專案範本,您可以控制的範本顯示於新的專案對話方塊,並以範本參數來取代。 .Vstemplate 檔案是描述如何將原始程式檔使用專案系統範本建立專案時要包含的 XML 檔案。 專案系統本身所收集的.vstemplate 檔和原始程式檔在.zip 檔案中,建置並部署的.zip 檔複製至位置,也是以 Visual Studio。 本逐步解說稍後詳細說明此程序。
在Visual Studio,開啟您依照建立 SimpleProject 方案建立基本專案系統,第 1 部分。
在 SimpleProjectPackage.cs 檔案中,尋找 ProvideProjectFactory 屬性。 取代 null,第二個參數 (專案名稱) 和第四個參數 (專案範本資料夾的路徑) 」。\\NullPath 」,如下所示。
[ProvideProjectFactory(typeof(SimpleProjectFactory), null, "Simple Project Files (*.myproj);*.myproj", "myproj", "myproj", ".\\NullPath", LanguageVsTemplate = "SimpleProject")]
加入名為 SimpleProject.vstemplate \Templates\Projects\SimpleProject\ 資料夾的 XML 檔案。
SimpleProject.vstemplate 的內容取代為下列程式碼。
<VSTemplate Version="2.0.0" Type="Project" xmlns="https://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <Name>SimpleProject Application</Name> <Description> A project for creating a SimpleProject application </Description> <Icon>SimpleProject.ico</Icon> <ProjectType>SimpleProject</ProjectType> </TemplateData> <TemplateContent> <Project File="SimpleProject.myproj" ReplaceParameters="true"> <ProjectItem ReplaceParameters="true" OpenInEditor="true"> Program.cs </ProjectItem> <ProjectItem ReplaceParameters="true" OpenInEditor="false"> AssemblyInfo.cs </ProjectItem> </Project> </TemplateContent> </VSTemplate>
在屬性視窗中,選取所有五個檔案的 \Templates\Projects\SimpleProject\ 資料夾,以及組建置動作至ZipProject。
<> >區段決定的位置和外觀 SimpleProject 專案類型中的新的專案對話方塊,如下所示︰
<> >項目名稱是 SimpleProject 應用程式的專案範本。
<> >項目包含描述出現在新的專案 對話方塊中選取專案範本時。
<> >項目會指定與 SimpleProject 專案類型一起出現的圖示。
<> >項目名稱中的專案類型新的專案對話方塊。 此名稱來取代 ProvideProjectFactory 屬性的專案名稱參數。
注意
<> >項目必須符合
LanguageVsTemplate
引數的ProvideProjectFactory
SimpleProjectPackage.cs 檔案中的屬性。
<> >一節將說明這些新的專案建立時產生的檔案︰
SimpleProject.myproj
Program.cs
AssemblyInfo.cs
這三個檔案有ReplaceParameters
設為 true,可讓參數替代。 Program.cs 檔案具有OpenInEditor
設為 true,這樣會造成要建立專案時,程式碼編輯器中開啟的檔案。
如需 Visual Studio 範本結構描述中元素的詳細資訊,請參閱Visual Studio 範本結構描述參考。
注意
如果專案具有一個以上的 Visual Studio 範本,每一個範本是另一個資料夾中。 在該資料夾中的每個檔案必須具有建置動作設ZipProject。
加入最小.vsct 檔案
Visual Studio 必須能夠辨識新的或修改 Visual Studio 範本安裝模式中執行。 安裝模式需要.vsct 檔必須存在。 因此,您必須將最小.vsct 檔加入專案。
加入名為 SimpleProject.vsct SimpleProject 專案的 XML 檔案。
SimpleProject.vsct 檔案的內容取代為下列程式碼。
<?xml version="1.0" encoding="utf-8" ?> <CommandTable xmlns="https://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable"> </CommandTable>
設定建置動作到這個檔案的VSCTCompile。 您可以只在.csproj 檔案中,不會在屬性視窗。 請確定建置動作這個檔案設定為無此時。
SimpleProject 節點上按一下滑鼠右鍵,然後按一下 編輯 SimpleProject.csproj。
在.csproj 檔案中,找出 SimpleProject.vsct 項目。
<None Include="SimpleProject.vsct" />
變更的建置動作VSCTCompile。
<VSCTCompile Include="SimpleProject.vsct" />
專案檔,然後關閉編輯器。
儲存 SimpleProject 節點,然後在方案總管 中按一下重新載入專案。
檢查 Visual Studio 範本建立步驟
當.vstemplate 檔已變更,或重建專案,其中包含.vstemplate 檔案 VSPackage 專案建置系統通常以安裝模式執行 Visual Studio。 您可以遵循藉由設定為 Normal 或更高版本的 MSBuild 的詳細資訊層級。
在 [ 工具 ] 功能表上按一下 [ 選項]。
展開專案和方案節點,然後再選取建置並執行。
設定MSBuild 專案建置輸出詳細程度至正常。 按一下 [確定]。
重建 SimpleProject 專案。
建置步驟,建立.zip 專案檔應該類似下列的範例。
ZipProjects:
1> Zipping ProjectTemplates
1> Zipping <path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip...
1> Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "<%LOCALAPPDATA%>\Microsoft\VisualStudio\14.0Exp\ProjectTemplates\\\\SimpleProject.zip".
1> Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "bin\Debug\\ProjectTemplates\\\\SimpleProject.zip".
1> SimpleProject -> <path>\SimpleProject\SimpleProject\bin\Debug\ProjectTemplates\SimpleProject.zip
1>ZipItems:
1> Zipping ItemTemplates
1> SimpleProject ->
部署 Visual Studio 範本
Visual Studio 範本不包含路徑資訊。 因此,範本.zip 檔案必須部署至位置,也是以 Visual Studio。 ProjectTemplates 資料夾的位置通常是**<%LOCALAPPDATA%> \Microsoft\VisualStudio\14.0Exp\ProjectTemplates**。
若要部署您專案的 factory,安裝程式必須具有系統管理員權限。 它會部署在 Visual Studio 的 [安裝] 節點下的範本︰ ...\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates。
測試 Visual Studio 範本
測試您的專案 factory,以查看是否會使用 Visual Studio 範本建立專案階層架構。
重設 Visual Studio SDK experimental 執行個體。
在Windows 7︰ 在 [開始] 功能表中,找到Microsoft Visual Studio/Microsoft Visual Studio SDK/工具資料夾,然後再選取重設 Microsoft Visual Studio Experimental 執行個體。
更新版本的 Windows 上︰ 在 [開始] 畫面中,輸入重設 Microsoft Visual Studio <> >實驗執行個體。
命令提示字元 視窗隨即出現。 當您看到幾個字
Press any key to continue
,按 enter 鍵。 在視窗關閉之後,開啟 Visual Studio。重建 SimpleProject 專案並開始偵錯。 實驗執行個體隨即出現。
在實驗執行個體中,建立 SimpleProject 專案。 在新的專案對話方塊中,選取SimpleProject。
您應該會看到 SimpleProject 的新執行個體。
建立專案類型的子節點
您可以加入的專案型別節點中子節點新的專案對話方塊。 比方說,SimpleProject 專案類型,您有子節點的主控台應用程式、 視窗應用程式、 web 應用程式等等。
子節點會建立變更專案檔,並新增<>>子系<>>項目。 複製範本時,組建或部署期間,每個子節點會成為專案範本資料夾的子資料夾。
本節說明如何建立主控台 SimpleProject 專案類型的子節點。
將 \Templates\Projects\SimpleProject\ 資料夾重新命名為 \Templates\Projects\ConsoleApp\。
在屬性 視窗中,選取 \Templates\Projects\ConsoleApp\ 資料夾中的所有五個檔案,並確定建置動作設為ZipProject。
在 SimpleProject.vstemplate 檔案中,加入下列這一行的結尾<>>區段中的,結尾標記前面。
<NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
這會導致出現在主控台的子節點和 SimpleProject 父節點,也就是一層的子節點中的主控台應用程式範本。
儲存 SimpleProject.vstemplate 檔案。
在.csproj 檔案中,加入<>>每 ZipProject 項目。 卸載的專案,並編輯專案檔。
找出<>>項目。 每個<>>項目,加入<>>項目並指定其值為主控台。 ZipProject
<ZipProject Include="Templates\Projects\ConsoleApp\AssemblyInfo.cs"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\Program.cs"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.myproj"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.vstemplate"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.ico"> <OutputSubPath>Console</OutputSubPath> </ZipProject>
加入下列<>>專案檔︰
<PropertyGroup> <VsTemplateLanguage>SimpleProject</VsTemplateLanguage> </PropertyGroup>
儲存專案檔,並重新載入專案。
測試專案類型的子節點
測試修改過的專案檔案,以查看是否主控台子節點會出現在新的專案對話方塊。
執行重設 Microsoft Visual Studio 實驗執行個體工具。
重建 SimpleProject 專案並開始偵錯。 實驗執行個體應該會出現
在新的專案] 對話方塊中,按一下 [ SimpleProject節點。 主控台應用程式範本應該會出現在範本窗格。
展開SimpleProject節點。 主控台子節點應該會出現。 SimpleProject 應用程式範本仍會出現在範本窗格。
。 按一下 取消和停止偵錯
專案範本參數
建立基本專案系統,第 1 部分示範如何覆寫ProjectNode.AddFileFromTemplate
方法,以進行基本的一種範本參數替代。 本章節會教導如何使用更複雜的 Visual Studio 範本參數。
當您使用 Visual Studio 範本中的建立專案時新的專案對話方塊中,以自訂專案範本會以取代參數字串。 樣板參數是特殊的語彙基元開始和結束都錢幣符號,例如 $time$。 下列兩個參數會啟用自訂範本為基礎的專案中特別有用︰
$ $GUID [1-10] 取代為新的 Guid。 您可以指定最多 10 個唯一的 Guid,例如,$guid1$。
$safeprojectname$ 是中的使用者所提供的名稱新的專案對話方塊中,修改以移除所有 unsafe 字元和空格。
如需範本參數的完整清單,請參閱範本參數。 如果您想要建立您自己的自訂範本參數,請參閱NIB: How to︰ 將傳遞至範本的自訂參數。
將專案範本參數
在 SimpleProjectNode.cs 檔案中,移除
AddFileFromTemplate
方法。在 \Templates\Projects\ConsoleApp\SimpleProject.myproj 檔案中,找出<>>屬性並將其值變更為 $safeprojectname$。
<RootNamespace>$safeprojectname$</RootNamespace>
在 \Templates\Projects\SimpleProject\Program.cs 檔案中,請以下列程式碼取代檔案的內容︰
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; // Guid namespace $safeprojectname$ { [Guid("$guid1$")] public class $safeprojectname$ { static void Main(string[] args) { Console.WriteLine("Hello VSX!!!"); Console.ReadKey(); } } }
重建 SimpleProject 專案並開始偵錯。 實驗執行個體應該會出現。
建立新的 SimpleProject 主控台應用程式。 (在專案類型窗格中,選取SimpleProject。 在Visual Studio 安裝的範本,請選取主控台應用程式。)
在新建立專案中,開啟 Program.cs。 看起來應該如下所示 (在檔案中的 GUID 值將會不同)。:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; // Guid namespace Console_Application1 { [Guid("00000000-0000-0000-00000000-00000000)"] public class Console_Application1 { static void Main(string[] args) { Console.WriteLine("Hello VSX!!!"); Console.ReadKey(); } } }
建立專案屬性頁
讓使用者可以檢視並變更您的範本為基礎的專案中的屬性,您可以建立您的專案類型的屬性頁。 本節說明如何建立組態無關的屬性頁。 這個基本的屬性頁會使用屬性方格來顯示在屬性頁面類別中公開 (expose) 的公用屬性。
衍生您的屬性頁面類別,從SettingsPage
基底類別。 所提供的 [屬性] 方格SettingsPage
類別知道最基本資料型別,並知道如何顯示它們。 此外,SettingsPage
類別知道如何保存專案檔的屬性值。
您在這一節中建立屬性頁可讓您變更並儲存這些專案屬性︰
AssemblyName
OutputType
RootNamespace。
在 SimpleProjectPackage.cs 檔案中,加入下列
ProvideObject
屬性設定為SimpleProjectPackage
類別︰[ProvideObject(typeof(GeneralPropertyPage))] public sealed class SimpleProjectPackage : ProjectPackage
這會註冊屬性頁類別
GeneralPropertyPage
com。在 SimpleProjectNode.cs 檔案中,加入至這兩個覆寫的方法
SimpleProjectNode
類別︰protected override Guid[] GetConfigurationIndependentPropertyPages() { Guid[] result = new Guid[1]; result[0] = typeof(GeneralPropertyPage).GUID; return result; } protected override Guid[] GetPriorityProjectDesignerPages() { Guid[] result = new Guid[1]; result[0] = typeof(GeneralPropertyPage).GUID; return result; }
這兩種方法會傳回陣列的屬性頁的 Guid。 GeneralPropertyPage GUID 是唯一的項目,在陣列中,所以屬性頁對話方塊將會顯示一個頁面。
新增名為 GeneralPropertyPage.cs SimpleProject 專案的類別檔案。
使用下列程式碼來取代此檔案的內容︰
using System; using System.Runtime.InteropServices; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Project; using System.ComponentModel; namespace SimpleProject { [ComVisible(true)] [Guid("6BC7046B-B110-40d8-9F23-34263D8D2936")] public class GeneralPropertyPage : SettingsPage { private string assemblyName; private OutputType outputType; private string defaultNamespace; public GeneralPropertyPage() { this.Name = "General"; } [Category("AssemblyName")] [DisplayName("AssemblyName")] [Description("The output file holding assembly metadata.")] public string AssemblyName { get { return this.assemblyName; } } [Category("Application")] [DisplayName("OutputType")] [Description("The type of application to build.")] public OutputType OutputType { get { return this.outputType; } set { this.outputType = value; this.IsDirty = true; } } [Category("Application")] [DisplayName("DefaultNamespace")] [Description("Specifies the default namespace for added items.")] public string DefaultNamespace { get { return this.defaultNamespace; } set { this.defaultNamespace = value; this.IsDirty = true; } } protected override void BindProperties() { this.assemblyName = this.ProjectMgr.GetProjectProperty( "AssemblyName", true); this.defaultNamespace = this.ProjectMgr.GetProjectProperty( "RootNamespace", false); string outputType = this.ProjectMgr.GetProjectProperty( "OutputType", false); this.outputType = (OutputType)Enum.Parse(typeof(OutputType), outputType); } protected override int ApplyChanges() { this.ProjectMgr.SetProjectProperty( "AssemblyName", this.assemblyName); this.ProjectMgr.SetProjectProperty( "OutputType", this.outputType.ToString()); this.ProjectMgr.SetProjectProperty( "RootNamespace", this.defaultNamespace); this.IsDirty = false; return VSConstants.S_OK; } } }
GeneralPropertyPage
類別會公開三個公用屬性 AssemblyName、 OutputType 和 RootNamespace。 因為 AssemblyName 不具 set 方法,就會顯示為唯讀屬性。 OutputType 是列舉的常數,因此它會顯示為下拉式清單中。SettingsPage
基底類別提供ProjectMgr
保存屬性。BindProperties
方法會使用ProjectMgr
擷取保存的屬性值,並設定對應的屬性。ApplyChanges
方法會使用ProjectMgr
以取得屬性的值,並將其保存在專案檔。 這個屬性設定方法會設定IsDirty
指出屬性需要保存為 true。 當您儲存專案或方案時,就會發生持續性。重建 SimpleProject 方案並開始偵錯。 實驗執行個體應該會出現。
在實驗執行個體中,建立新的 SimpleProject 應用程式。
Visual Studio 會呼叫您使用 Visual Studio 範本建立專案的專案 factory。 程式碼編輯器中開啟新的 Program.cs 檔案。
以滑鼠右鍵按一下專案節點中的方案總管] 中,然後按一下 [屬性。 屬性頁對話方塊隨即出現。
測試專案屬性頁
現在您可以測試是否可以修改,並變更屬性值。
在**{1>myconsoleapplication 屬性頁對話方塊中, DefaultNamespace至MyApplication**。
選取OutputType屬性,然後再選取類別庫。
按一下 套用,然後按一下 確定。
重新開啟屬性頁對話方塊並確認您的變更已保存下來。
關閉 Visual Studio 的實驗執行個體。
重新開啟的實驗執行個體。
重新開啟屬性頁對話方塊並確認您的變更已保存下來。
關閉 Visual Studio 的實驗執行個體。