常見問題集:將增益集轉換成 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
建立 Visual Studio Package 專案,並將其命名為 TestVSPackage。 ([檔案]、[新增]、[專案],或是在 [快速啟動] 視窗中輸入專案)。 在 [新增專案] 對話方塊中,展開 [其他專案類型]、[擴充性],然後選取 [Visual Studio Package]。 將專案命名為 TestVSPackage 並為其指定位置。
[Visual Studio Package 精靈] 隨即出現。 在其 [選取程式設計語言] 頁面上,選取 C# 做為語言。 保持選取 [產生新金鑰] 選項。 在 [VSPackage 選項] 頁面上,選取 [功能表命令]。 選擇 [完成] 按鈕。
按 F5,以偵錯模式建置並執行專案。
Visual Studio 的第二個執行個體隨即出現。 第二個執行個體稱為實驗執行個體,其設定可能與您正用來撰寫程式碼的 Visual Studio 執行個體的設定不同。 第一次執行實驗執行個體時,系統會要求您登入 VS Online 並指定佈景主題和設定檔。
在 [工具] 功能表上 (在實驗執行個體中),您會看到一個名為 [我的命令名稱] 的按鈕。 當您選擇此按鈕時,會出現一則訊息:在 TestVSPackagePackage.MenuItemCallback() 之中。
如何在 VSPackage 中執行增益集程式碼?
增益集程式碼通常以兩種方式之一執行:
由功能表命令觸發 (程式碼在 IDTCommandTarget.Exec 方法中)
啟動時自動執行 (程式碼在 OnConnection 事件處理常式中。)
您可以在 VSPackage 中執行相同的動作。 以下是如何在回呼方法加入一些增益集程式碼:
在 VSPackage 中實作功能表命令
建立具有功能表命令的 VSPackage。 (請參閱如何開始開發 VSPackage 擴充功能?)。
開啟包含 VSPackage 之定義的檔案。 (在 C# 專案中,它是 <您的專案名稱>Package.cs。)
將下列 using 陳述式加入檔案中:
using EnvDTE; using EnvDTE80;
尋找 MenuItemCallback 方法。 加入 GetService 的呼叫以取得 DTE2 物件:
DTE2 dte = (DTE2)GetService(typeof(DTE));
在增益集的 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"); }
建置並執行此專案。 按 F5 或選取 [偵錯] 工具列上的 [開始]。 在 Visual Studio 的實驗執行個體中,[工具] 功能表應該會有一個名為 [我的命令名稱] 的按鈕。 當您選擇此按鈕時,[Some Text] 等文字應該會出現在 [輸出] 視窗窗格中。 (您可能必須開啟 [輸出] 視窗。)
您也可以讓程式碼在啟動時執行。 不過,通常不鼓勵對 VSPackage 擴充功能採用這種方法。 如果有太多擴充功能在 Visual Studio 啟動時嘗試載入,開始時間可能會變得很長。 較佳的做法是只在符合部分條件 (如開啟方案) 時才自動載入 VSPackage。
這項程序示範如何在方案開啟時自動載入的 VSPackage 中,執行增益集程式碼:
自動載入 VSPackage
建立 Visual Studio Package 專案。 (如需執行這項操作的步驟,請參閱如何開始開發 VSPackage 擴充功能?。 將專案命名為 TestAutoload 並為其指定位置。
[Visual Studio Package 精靈] 隨即出現。 在其 [選取程式設計語言] 頁面上,選取 C# 做為語言,並保持選取 [產生新金鑰] 選項。 選擇 [完成]。
開啟 TestAutoloadPackage.cs。 尋找宣告套件類別的一行:
public sealed class <name of your package>Package : Package
這一行上方是一組屬性。 加入此屬性:
[ProvideAutoLoad(UIContextGuids80.SolutionExists)]
在 Initialize() 方法中設定中斷點並開始偵錯 (F5)。
在實驗執行個體中,開啟專案。 這時 VSPackage 應會載入,並且叫用您的中斷點。
您可以使用 UIContextGuids80 的欄位指定要在其中載入 VSPackage 的其他內容。 如需詳細資訊,請參閱How to: 自動載入套件 VSPackage。
如何取得 DTE 物件?
如果您的增益集沒有顯示 UI (例如,功能表命令、工具列按鈕或工具視窗),只要從 VSPackage 取得 DTE 自動化物件,就可以依現狀使用您的程式碼。 方式如下:
從 VSPackage 取得 DTE 物件
在 VSPackage 方案中,尋找 <專案名稱>Package.cs 檔。 這是從 Package 衍生的類別;它可以幫助您與 Visual Studio 互動。 在這個案例中,您會使用其 GetService 取得 DTE2 物件。
加入以下 using 陳述式:
using EnvDTE; using EnvDTE80;
尋找 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
建立具有功能表命令的 VSPackage,如如何開始開發 VSPackage 擴充功能?一節所示。
開啟包含 VSPackage 之定義的檔案。 (在 C# 專案中,它是 <您的專案名稱>Package.cs。)
加入以下 using 陳述式:
using EnvDTE; using EnvDTE80;
尋找 MenuItemCallback 方法。 加入 GetService 的呼叫以取得 DTE2 物件:
DTE2 dte = (DTE2)GetService(typeof(DTE));
從增益集加入程式碼。 例如,以下的一些程式碼會將新工作加入 [工作清單] 、列出工作數,然後刪除一項工作。
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 中運作。 例如,這項程序示範如何加入可取得啟動專案的程式碼。
建立具有功能表命令的 VSPackage,如如何開始開發 VSPackage 擴充功能?一節所示。
開啟包含 VSPackage 之定義的檔案。 (在 C# 專案中,它是 <您的專案名稱>Package.cs。)
加入以下 using 陳述式:
using EnvDTE; using EnvDTE80;
尋找 MenuItemCallback 方法。 加入 GetService 的呼叫以取得 DTE2 物件:
DTE2 dte = (DTE2)GetService(typeof(DTE));
從增益集加入程式碼。 例如,以下程式碼會取得方案中啟動專案的名稱。 (此套件執行時,多專案方案必須已開啟。)
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;
}