常見問題集:將增益集轉換成 VSPackage 擴充功能

增益集目前已被取代。 要若要建立新的 Visual Studio 擴充功能,需要建立 VSPackage。 如果您已經有增益集,它仍然會執行;然而,如果您要散發它,則應將它轉換成 VSPackage。 以下是關於如何將 Visual Studio 增益集轉換成 VSPackage 擴充功能的一些常見問題的解答。

重要

在許多情況下,只要將增益集程式碼傳輸到 VSPackage 專案即可。在 Initialize 方法中呼叫 GetService,可以取得 DTE 自動化物件。

DTE2 dte = (DTE2)GetService(typeof(DTE));

如需詳細資訊,請參閱以下的如何在 VSPackage 中執行增益集程式碼?

要開發 VSPackage 擴充功能需要什麼軟體?

除了 Visual Studio 2013 Professional、Premium 或 Ultimate 版之外,您還需要安裝 Visual Studio 2013 SDK。 您可以從 Microsoft 下載中心網站上的 Visual Studio 2013 SDK 頁面下載 SDK。 建議您先安裝 SDK,然後再安裝 Visual Studio 2013 Update 2

VSPackage 文件在何處?

擴充 Visual Studio 的概觀 開始。 其他關於 VSPackage 開發的文章編排在該項目之下。

我可以將增益集專案轉換成 VSPackage 專案嗎?

增益集專案無法轉換成 VSPackage 專案,因為 VSPackage 專案中所使用的機制與增益集專案中的機制不同。 VSPackage 專案範本有大量的程式碼,使其相當容易做為 VSPackage 擴充功能來啟動與執行。

如何開始開發 VSPackage 擴充功能?

VSPackage 擴充功能的專案範本具有您所需的項目。 以下是具有功能表命令的 VSPackage 製作方式:

製作具有功能表命令的 VSPackage

  1. 建立 Visual Studio Package 專案,並將其命名為 TestVSPackage。 ([檔案]、[新增]、[專案],或是在 [快速啟動] 視窗中輸入專案)。 在 [新增專案] 對話方塊中,展開 [其他專案類型]、[擴充性],然後選取 [Visual Studio Package]。 將專案命名為 TestVSPackage 並為其指定位置。

  2. [Visual Studio Package 精靈] 隨即出現。 在其 [選取程式設計語言] 頁面上,選取 C# 做為語言。 保持選取 [產生新金鑰] 選項。 在 [VSPackage 選項] 頁面上,選取 [功能表命令]。 選擇 [完成] 按鈕。

  3. 按 F5,以偵錯模式建置並執行專案。

    Visual Studio 的第二個執行個體隨即出現。 第二個執行個體稱為實驗執行個體,其設定可能與您正用來撰寫程式碼的 Visual Studio 執行個體的設定不同。 第一次執行實驗執行個體時,系統會要求您登入 VS Online 並指定佈景主題和設定檔。

    在 [工具] 功能表上 (在實驗執行個體中),您會看到一個名為 [我的命令名稱] 的按鈕。 當您選擇此按鈕時,會出現一則訊息:在 TestVSPackagePackage.MenuItemCallback() 之中

如何在 VSPackage 中執行增益集程式碼?

增益集程式碼通常以兩種方式之一執行:

  • 由功能表命令觸發 (程式碼在 IDTCommandTarget.Exec 方法中)

  • 啟動時自動執行 (程式碼在 OnConnection 事件處理常式中。)

您可以在 VSPackage 中執行相同的動作。 以下是如何在回呼方法加入一些增益集程式碼:

在 VSPackage 中實作功能表命令

  1. 建立具有功能表命令的 VSPackage。 (請參閱如何開始開發 VSPackage 擴充功能?)。

  2. 開啟包含 VSPackage 之定義的檔案。 (在 C# 專案中,它是 <您的專案名稱>Package.cs。)

  3. 將下列 using 陳述式加入檔案中:

    using EnvDTE;
    using EnvDTE80;
    
  4. 尋找 MenuItemCallback 方法。 加入 GetService 的呼叫以取得 DTE2 物件:

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. 在增益集的 IDTCommandTarget.Exec 方法中加入其具有的程式碼。 例如,以下的一些程式碼會將新窗格加入 [輸出] 視窗並在新窗格中列印 "Some Text"。

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE));
        OutputWindow outputWindow = dte.ToolWindows.OutputWindow;
    
        OutputWindowPane outputWindowPane = outputWindow.OutputWindowPanes.Add("A New Pane");
        outputWindowPane.OutputString("Some Text");
    }
    
  6. 建置並執行此專案。 按 F5 或選取 [偵錯] 工具列上的 [開始]。 在 Visual Studio 的實驗執行個體中,[工具] 功能表應該會有一個名為 [我的命令名稱] 的按鈕。 當您選擇此按鈕時,[Some Text] 等文字應該會出現在 [輸出] 視窗窗格中。 (您可能必須開啟 [輸出] 視窗。)

您也可以讓程式碼在啟動時執行。 不過,通常不鼓勵對 VSPackage 擴充功能採用這種方法。 如果有太多擴充功能在 Visual Studio 啟動時嘗試載入,開始時間可能會變得很長。 較佳的做法是只在符合部分條件 (如開啟方案) 時才自動載入 VSPackage。

這項程序示範如何在方案開啟時自動載入的 VSPackage 中,執行增益集程式碼:

自動載入 VSPackage

  1. 建立 Visual Studio Package 專案。 (如需執行這項操作的步驟,請參閱如何開始開發 VSPackage 擴充功能?。 將專案命名為 TestAutoload 並為其指定位置。

  2. [Visual Studio Package 精靈] 隨即出現。 在其 [選取程式設計語言] 頁面上,選取 C# 做為語言,並保持選取 [產生新金鑰] 選項。 選擇 [完成]。

  3. 開啟 TestAutoloadPackage.cs。 尋找宣告套件類別的一行:

    public sealed class <name of your package>Package : Package
    
  4. 這一行上方是一組屬性。 加入此屬性:

    [ProvideAutoLoad(UIContextGuids80.SolutionExists)]
    
  5. 在 Initialize() 方法中設定中斷點並開始偵錯 (F5)。

  6. 在實驗執行個體中,開啟專案。 這時 VSPackage 應會載入,並且叫用您的中斷點。

您可以使用 UIContextGuids80 的欄位指定要在其中載入 VSPackage 的其他內容。 如需詳細資訊,請參閱How to: 自動載入套件 VSPackage

如何取得 DTE 物件?

如果您的增益集沒有顯示 UI (例如,功能表命令、工具列按鈕或工具視窗),只要從 VSPackage 取得 DTE 自動化物件,就可以依現狀使用您的程式碼。 方式如下:

從 VSPackage 取得 DTE 物件

  1. 在 VSPackage 方案中,尋找 <專案名稱>Package.cs 檔。 這是從 Package 衍生的類別;它可以幫助您與 Visual Studio 互動。 在這個案例中,您會使用其 GetService 取得 DTE2 物件。

  2. 加入以下 using 陳述式:

    using EnvDTE;
    using EnvDTE80;
    
  3. 尋找 Initialize 方法。 這個方法可處理您在套件精靈中指定的命令。 加入 GetService 的呼叫以取得 DTE 物件:

    DTE dte = (DTE)GetService(typeof(DTE));
    

具有 DTE 自動化物件之後,您可以將其餘的增益集程式碼加入專案。 如果您需要 DTE2 物件,可以執行相同動作。

如何將增益集中的功能表命令和工具列按鈕變更為 VSPackage 樣式?

VSPackage 擴充功能使用 .vsct 檔建立大部分的功能表命令、工具列、工具列按鈕和其他 UI。 VSPackage 專案範本讓您可以選擇在 [工具] 功能表上建立命令。 如需詳細資訊,請參閱逐步解說: 使用 Visual Studio 的封裝範本建立功能表命令

如需 .vsct 檔的詳細資訊,請參閱 VSPackages 對 IDE 所新增的使用者介面項目。 如需示範如何使用 .vsct 檔加入功能表項目、工具列和工具列按鈕的逐步解說,請參閱 命令、 功能表和工具列的逐步解說

如何以 VSPackage 方式加入自訂工具視窗?

VSPackage 專案範本讓您可以選擇建立工具視窗。 如需詳細資訊,請參閱 工具視窗 以及其下的文章,特別是 How to: 建立工具視窗

如何以 VSPackage 方式管理 Visual Studio 視窗?

如果您的增益集管理 Visual Studio 視窗,增益集程式碼應該能夠在 VSPackage 中運作。 例如,這項程序示範如何將管理 [工作清單] 的程式碼加入 VSPackage 的 MenuItemCallback 方法。

將視窗管理程式碼從增益集插入 VSPackage

  1. 建立具有功能表命令的 VSPackage,如如何開始開發 VSPackage 擴充功能?一節所示。

  2. 開啟包含 VSPackage 之定義的檔案。 (在 C# 專案中,它是 <您的專案名稱>Package.cs。)

  3. 加入以下 using 陳述式:

    using EnvDTE;
    using EnvDTE80;
    
  4. 尋找 MenuItemCallback 方法。 加入 GetService 的呼叫以取得 DTE2 物件:

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. 從增益集加入程式碼。 例如,以下的一些程式碼會將新工作加入 [工作清單] 、列出工作數,然後刪除一項工作。

    private void MenuItemCallback(object sender, EventArgs e) 
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE)); 
    
        TaskList tl = (TaskList)dte.ToolWindows.TaskList; 
        askItem tlItem; 
    
        // Add a couple of tasks to the Task List. 
        tlItem = tl.TaskItems.Add(" ", " ", "Test task 1.",  
            vsTaskPriority.vsTaskPriorityHigh, vsTaskIcon.vsTaskIconUser, 
            true, "", 10, true, true);
        tlItem = tl.TaskItems.Add(" ", " ", "Test task 2.", 
            vsTaskPriority.vsTaskPriorityLow, vsTaskIcon.vsTaskIconComment, true, "", 20, true,true);
    
        // List the total number of task list items after adding the new task items.
        System.Windows.Forms.MessageBox.Show("Task Item 1 description: "+tl.TaskItems.Item(2).Description);
        System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); 
    
        // Remove the second task item. The items list in reverse numeric order. 
        System.Windows.Forms.MessageBox.Show("Deleting the second task item");
        tl.TaskItems.Item(2).Delete();
        System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); 
    }
    

如何在 VSPackage 中管理專案和方案?

如果您的增益集管理專案和方案,增益集程式碼應該能夠在 VSPackage 中運作。 例如,這項程序示範如何加入可取得啟動專案的程式碼。

  1. 建立具有功能表命令的 VSPackage,如如何開始開發 VSPackage 擴充功能?一節所示。

  2. 開啟包含 VSPackage 之定義的檔案。 (在 C# 專案中,它是 <您的專案名稱>Package.cs。)

  3. 加入以下 using 陳述式:

    using EnvDTE;
    using EnvDTE80;
    
  4. 尋找 MenuItemCallback 方法。 加入 GetService 的呼叫以取得 DTE2 物件:

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. 從增益集加入程式碼。 例如,以下程式碼會取得方案中啟動專案的名稱。 (此套件執行時,多專案方案必須已開啟。)

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE)); 
    
        SolutionBuild2 sb = (SolutionBuild2)dte.Solution.SolutionBuild; 
        Project startupProj; 
        string msg = "";
    
        foreach (String item in (Array)sb.StartupProjects) 
        {
            msg += item; 
        }
        System.Windows.Forms.MessageBox.Show("Solution startup Project: "+msg); 
        startupProj = dte.Solution.Item(msg); 
        System.Windows.Forms.MessageBox.Show("Full name of solution's startup project: "+"/n"+startupProj.FullName); 
    }
    

如何在 VSPackage 中設定鍵盤快速鍵?

您可以使用 .vsct 檔的 <KeyBindings> 項目。 在下列範例中,命令 idCommand1 的鍵盤快速鍵為 Alt+A,而命令 idCommand2 的鍵盤快速鍵為 Alt+Ctrl+A。 請注意按鍵名稱的語法。

<KeyBindings>
    <KeyBinding guid="MyProjectCmdSet" id="idCommand1" editor="guidVSStd97" key1="A" mod1="ALT" />
    <KeyBinding guid="MyProjectCmdSet" id="idCommand2" editor="guidVSStd97" key1="A" mod1="CONTROL" mod2="ALT" />
</KeyBindings>

如何在 VSPackage 中處理自動化事件?

在 VSPackage 中處理自動化事件的方式與在增益集中的方式相同。 下列程式碼將示範如何處理 OnItemRenamed 事件。 (這個範例假設您已經取得 DTE 物件。)

Events2 dteEvents = (Events2)dte.Events;
dteEvents.ProjectItemsEvents.ItemRenamed += listener1.OnItemRenamed; 
. . .
public void OnItemRenamed(EnvDTE.ProjectItem projItem, string oldName) 
{
    string s = "[Event] Renamed " + oldName + " to " + Path.GetFileName(projItem.get_FileNames(1) + " in project " + projItem.ContainingProject.Name; 
}