共用方式為


搭配專案範本使用精靈

Visual Studio 提供 IWizard 介面,在實作時,可讓您在使用者從範本建立專案時執行自訂程式碼。

專案範本自訂可用來顯示自訂 UI,以收集使用者輸入以自訂範本、將其他檔案新增至範本,或專案上允許的任何其他動作。

在專案建立時,會在各種時間呼叫 IWizard 介面方法,只要使用者按一下 [新增專案] 對話方塊上的 [確定] 即可開始。 介面的每個方法都會命名,以描述呼叫它的點。 例如,Visual Studio 會在開始建立專案時立即呼叫 RunStarted,使其成為撰寫自訂程式碼來收集使用者輸入的好位置。

使用 VSIX 專案建立專案範本專案

您開始使用專案範本專案來建立自訂範本,該專案是 Visual Studio SDK 的一部分。 在此程序中,我們將使用 C# 專案範本專案,但也有 Visual Basic 專案範本專案。 然後,將 VSIX 專案新增至包含專案範本專案的解決方案。

  1. 建立 C# 專案範本專案 (在 Visual Studio 中,選取 [檔案]>[新增]>[專案] 並搜尋「項目範本」)。 將它命名為 MyProjectTemplate

    注意

    系統可能會要求您安裝 Visual Studio SDK。 如需詳細資訊,請參閱安裝 Visual Studio SDK

  2. 在與專案範本專案相同的方案中新增新的 VSIX 專案 (在 [解決方案總管] 中,選取解決方案節點,按一下滑鼠右鍵,然後選取 [新增]>[新增專案],然後搜尋 「vsix」。 將它命名為 MyProjectWizard

  3. 將 VSIX 專案設定為啟動專案。 在 [解決方案總管] 中,選取 VSIX 專案節點,按一下滑鼠右鍵,並選取 [設定為啟動專案]

  4. 將範本專案新增為 VSIX 專案的資產。 在解決方案總管的 VSIX 專案節點下,尋找 source.extension.vsixmanifest 檔案。 按兩下它以在資訊清單編輯器中加以開啟。

  5. 在資訊清單編輯器中,選取視窗左側的 [資產] 索引標籤。

  6. [資產] 索引標籤中,選取 [新增]。 在 [新增資產] 視窗中,針對 [類型] 欄位,選取 Microsoft.VisualStudio.ProjectTemplate。 在 [來源] 欄位中,選取目前解決方案中的專案。 在[專案] 欄位中,選取 MyProjectTemplate。 然後按一下 [確定] 。

  7. 組建方案並開始偵錯。 Visual Studio 的第二個執行個體隨即出現。 (這可能需要幾分鐘的時間。)

  8. 在第二個 Visual Studio 執行個體中,嘗試使用新的範本建立新專案 ([檔案]>[新增>專案],搜尋「myproject」。 新的專案應該會出現名為 Class1 的類別。 您現在已建立自訂專案範本! 立即停止偵錯。

建立自訂範本精靈

此程序示範如何建立自訂精靈,以在建立專案之前開啟 Windows Form。 表單可讓使用者在專案建立期間針對新增至原始程式碼的自訂參數值進行新增。

  1. 設定 VSIX 專案以允許它建立組件。

  2. [解決方案總管] 中選取 VSIX 專案節點。 在 [解決方案總管] 下方,您應該會看到 [屬性] 視窗。 如果沒有,請選取 [檢視]>[屬性視窗],或按 F4。 在 [屬性] 視窗中,選取下列欄位至 true

    • 在 VSIX 容器中包含組件

    • 在本機 VSIX 部署中包括 Debug 符號

    • 在 VSIX 容器中包含偵錯符號

  3. 將組件新增為 VSIX 專案的資產。 開啟 source.extension.vsixmanifest 檔案,然後選取 [資產] 索引標籤。在 [新增資產] 視窗中,針對 [類型] 選取 Microsoft.VisualStudio.Assembly,針對 [來源] 選取目前解決方案中的專案,並針對 [專案] 選取 MyProjectWizard

  4. 將下列參考加入至 VSIX 專案。 (在 [解決方案總管] 的 VSIX 專案節點底下,選取 [參考],按一下滑鼠右鍵,然後選取 [新增參考]。在 [新增參考] 對話方塊的 [架構] 索引標籤中,尋找 System.Windows Forms 組件並加以選取。 同時尋找並選取 SystemSystem.Drawing 組件。 現在,選取 [擴充功能] 索引標籤。尋找 EnvDTE 組件並加以選取。 另請尋找 Microsoft.VisualStudio.TemplateWizardInterface 組件並加以選取。 按一下 [確定]

  5. 將精靈實作的類別新增至 VSIX 專案。 (在 [解決方案總管] 中,以滑鼠右鍵按一下 VSIX 專案節點,然後選取 [新增][新增項目],然後選取 [類別]。將類別命名為 WizardImplementation

  6. 以下列程式碼取代 WizardImplementationClass.cs 檔案中的程式碼。

    using System;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TemplateWizard;
    using System.Windows.Forms;
    using EnvDTE;
    
    namespace MyProjectWizard
    {
        public class WizardImplementation:IWizard
        {
            private UserInputForm inputForm;
            private string customMessage;
    
            // This method is called before opening any item that
            // has the OpenInEditor attribute.
            public void BeforeOpeningFile(ProjectItem projectItem)
            {
            }
    
            public void ProjectFinishedGenerating(Project project)
            {
            }
    
            // This method is only called for item templates,
            // not for project templates.
            public void ProjectItemFinishedGenerating(ProjectItem
                projectItem)
            {
            }
    
            // This method is called after the project is created.
            public void RunFinished()
            {
            }
    
            public void RunStarted(object automationObject,
                Dictionary<string, string> replacementsDictionary,
                WizardRunKind runKind, object[] customParams)
            {
                try
                {
                    // Display a form to the user. The form collects
                    // input for the custom message.
                    inputForm = new UserInputForm();
                    inputForm.ShowDialog();
    
                    customMessage = UserInputForm.CustomMessage;
    
                    // Add custom parameters.
                    replacementsDictionary.Add("$custommessage$",
                        customMessage);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
    
            // This method is only called for item templates,
            // not for project templates.
            public bool ShouldAddProjectItem(string filePath)
            {
                return true;
            }
        }
    }
    

    稍後會實作此程式碼中所參考的 UserInputForm

    WizardImplementation 類別包含 IWizard 每個成員的方法實作。 在此範例中,只有 RunStarted 方法會執行工作。 所有其他方法都未執行任何動作或傳回 true

    RunStarted 方法可接受四個參數:

    • 可以轉換成根目錄 _DTE 物件的 Object 參數,可讓您自訂專案。

    • Dictionary<TKey,TValue> 參數,其中包含範本中所有預先定義參數的集合。 如需範本參數的詳細資訊,請參閱範本參數

    • WizardRunKind參數,其中包含使用何種範本的相關資訊。

    • Object 陣列,其中包含 Visual Studio 傳遞至精靈的一組參數。

      本範例會將使用者輸入表單的參數值新增至 Dictionary<TKey,TValue> 參數。 專案中 $custommessage$ 參數的每個執行個體都會取代為使用者輸入的文字。

  7. 現在,建立 UserInputForm。 在 WizardImplementation.cs 檔案中,於 WizardImplementation 類別結尾之後新增下列程式碼。

    public partial class UserInputForm : Form
        {
            private static string customMessage;
            private TextBox textBox1;
            private Button button1;
    
            public UserInputForm()
            {
                this.Size = new System.Drawing.Size(155, 265);
    
                button1 = new Button();
                button1.Location = new System.Drawing.Point(90, 25);
                button1.Size = new System.Drawing.Size(50, 25);
                button1.Click += button1_Click;
                this.Controls.Add(button1);
    
                textBox1 = new TextBox();
                textBox1.Location = new System.Drawing.Point(10, 25);
                textBox1.Size = new System.Drawing.Size(70, 20);
                this.Controls.Add(textBox1);
            }
            public static string CustomMessage
            {
                get
                {
                    return customMessage;
                }
                set
                {
                    customMessage = value;
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                customMessage = textBox1.Text;
                this.Close();
            }
        }
    

    使用者輸入表單提供簡單的表單來輸入自訂參數。 表單包含名為 textBox1 的文字方塊,以及名為 button1 的按鈕。 按一下按鈕時,文字方塊中的文字會儲存在 customMessage 參數中。

將精靈連線至自訂範本

若要讓自訂專案範本使用自訂精靈,您必須簽署精靈組件,並將一些行新增至自訂專案範本,讓它知道在建立新專案時要在哪裡尋找精靈實作。

  1. 簽署組件。 在 [解決方案總管] 上,選取 VSIX 專案,按一下滑鼠右鍵,然後選取 [專案屬性]

  2. [專案屬性] 視窗中,選取 [簽署] 索引標籤。在 [簽署] 索引標籤中,勾選 [簽署組件]。 在 [選擇字串名稱金鑰檔] 欄位中,選取 <新增>。 在 [建立強名稱金鑰] 視窗中,於 [金鑰檔案名稱] 欄位中輸入 key.snk。 取消選取 [以密碼保護我的金鑰檔案] 欄位。

  3. [解決方案總管] 中,選取 VSIX 專案並尋找 [屬性] 視窗。

  4. [複製組建輸出至輸出目錄] 欄位設定為 true。 這可讓組件在重建方案時複製到輸出目錄中。 它仍然包含在 .vsix 檔案中。 您必須查看組件,才能找出其簽署金鑰。

  5. 重建方案。

  6. 您現在可以在 MyProjectWizard 專案目錄 (<your disk location>\MyProjectTemplate\MyProjectWizard\key.snk) 中找到 key.snk 檔案。 複製 key.snk 檔案。

  7. 移至輸出目錄並尋找組件 (<您的磁碟位置>\MyProjectTemplate/MyProjectWizard\bin\Debug\MyProjectWizard.dll)。 將 key.snk 檔案貼到這裡。 (這不是絕對必要,但它將使下列步驟更容易。)

  8. 開啟命令視窗,並變更為已建立組件的目錄。

  9. 尋找 sn.exe 簽署工具。 例如,在 Windows 10 64 位元作業系統上,一般路徑如下:

    C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools

    如果找不到此工具,請嘗試在命令視窗中執行 where /R . sn.exe。 記下此路徑。

  10. key.snk 檔案擷取公開金鑰。 在命令視窗中執輸入:

    <sn.exe>\sn.exe -p key.snk outfile.key 的位置。

    如果目錄名稱中有空格,別忘了以引號括住 sn.exe 的路徑!

  11. 從 outfile 取得公開金鑰權杖:

    <sn.exe>\sn.exe -t outfile.key 的位置。

    同樣地,別忘了引號。 您應該會在輸出中看到一行像這樣的內容

    公開金鑰權杖為<權杖>

    記下此值。

  12. 將自訂精靈的參考新增至專案範本的 .vstemplate 檔案。 在 [解決方案總管] 中,找到名為 MyProjectTemplate.vstemplate 的檔並將其開啟。 在 <TemplateContent> 區段的結尾之後,新增下列區段:

    <WizardExtension>
        <Assembly>MyProjectWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=token</Assembly>
        <FullClassName>MyProjectWizard.WizardImplementation</FullClassName>
    </WizardExtension>
    

    其中 MyProjectWizard 是組件的名稱,而 token 是您在上一個步驟中複製的權杖。

  13. 儲存專案中的所有檔案並重新建置。

將自訂參數新增至範本

在此範例中,做為範本的專案會顯示自訂精靈之使用者輸入表單中指定的訊息。

  1. [解決方案總管] 中,移至 MyProjectTemplate 專案,然後開啟 Class1.cs

  2. 在應用程式的 Main 方法中,新增下列程式碼行。

    Console.WriteLine("$custommessage$");
    

    從範本建立專案時,$custommessage$ 參數會取代為使用者輸入表單中輸入的文字。

以下是匯出至範本之前的完整程式碼檔案。

using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;

namespace $safeprojectname$
{
    public class Class1
    {
          static void Main(string[] args)
          {
               Console.WriteLine("$custommessage$");
          }
    }
}

使用自訂精靈

現在您可以從範本建立專案,並使用自訂精靈。

  1. 重新建置解決方案並開始偵錯。 Visual Studio 的第二個執行個體應該會出現。

  2. 建立新的 MyProjectTemplate 專案。 ([檔案]>[新增]>[專案])。

  3. [新增專案] 對話方塊中,搜尋「myproject」以尋找您的範本,輸入名稱,然後按一下 [確定]

    精靈使用者輸入表單隨即開啟。

  4. 輸入自訂參數的值,然後按一下按鈕。

    精靈使用者輸入表單隨即關閉,並從範本建立專案。

  5. [解決方案總管] 中,在原始程式碼檔案上按一下滑鼠右鍵,然後按一下 [檢視程式碼]

    請注意,$custommessage$ 已取代為精靈使用者輸入表單中輸入的文字。