本文會逐步引導您完成一些簡單的步驟,以啟動並執行您的第一個 Visual Studio 延伸模組。 Visual Studio 延伸模組是使用 .NET Framework 和 C# 撰寫。 如果您已經是 .NET 開發人員,您會發現編寫擴展與編寫大多數其他 .NET 程式和庫類似。
您今天要撰寫的擴充功能將新增一個命令,執行時會將新的 GUID 插入文字編輯器。 它簡單、有用,並且很好地介紹了擴展開發的各個方面。
如果您是視覺型學習者,請觀看此段簡短影片,顯示有人如何遵循教學課程。
在開始編寫您的第一個 Visual Studio 擴展之前(這很容易,我保證!),請確保您擁有 所需的工具。
建立專案
有多個項目模板可供選擇,因此您需要做出正確的選擇。 此社群工具組中使用的範本,名稱中都有暱稱 (社群) 。
VSIX 專案 w/Command(社群) 範本已整合了一個命令,使您能夠輕鬆地從此處開始。 對於大多數擴展來說,這是一個很好的起點。 如果您知道需要工具視窗,請使用 VSIX 專案 w/工具視窗 (社群) 範本。 它還有一個用於打開工具窗口的命令。
將 空白 VSIX 專案 (社群) 或 VSIX 專案 (社群) 範本用於僅限 MEF 的延伸模組或其他進階案例。
這次,您將選取 VSIX 專案 w/命令 (社群) 範本,如下列螢幕擷取畫面所示。
選擇專案範本後,您需要為您的專案命名。 將其稱為 InsertGuid。
點擊“ 創建 ”按鈕後,您應該最終會得到一個基本的 VSIX 項目,如下所示:
重要檔案
讓我們回顧一下最重要的文件。
InsertGuidPackage.cs 就是所謂的 Package 類別。 Visual Studio 會呼叫其 InitializeAsync(...) 方法來初始化您的延伸模組。 您可以從這裡添加事件偵聽器並註冊命令、工具窗口、設置和其他內容。
source.extension.vsixmanifest 是延伸模組的資訊清單檔案。 它包含標題和描述等元數據,但也包含有關擴充功能包含的內容的資訊。
VSCommandTable.vsct 是一個 XML 檔案,其中命令和按鍵繫結是以宣告方式定義的,因此可以向 Visual Studio 註冊它們。
Commands/MyCommand.cs 是 VSCommandTable.vsct 檔案中定義之命令的命令處理常式。 它控制透過按一下按鈕來執行命令時會發生什麼。
修改指令
首先,您想要確保您的命令在 Visual Studio 功能表系統中具有正確的名稱、圖示和位置。
開啟 VSCommandTable.vsct 檔案,然後找到 a <Group> 和 a <Button>。 請注意按鈕如何將群組指定為其父系,而群組的父系是內建的 VSMainMenu/Tools 功能表。
針對您的延伸模組,您想要 [插入 GUID ] 命令按鈕位於 [編輯 ] 主功能表底下,因此您要將群組重新父系為 [編輯] 功能表。 將 工具 替換成 編輯,就像以下程式碼片段一樣:
<Group guid="InsertGuid" id="MyMenuGroup" priority="0x0600">
<Parent guid="VSMainMenu" id="Edit"/>
</Group>
您可以獲得完整的 IntelliSense 來協助選擇合適的位置,使您輕鬆找到正確的地點。
<Button>也需要更新。 您將透過將id屬性更新為<Icon>來給元素新的圖示。 更新<ButtonText>文字為良好的描述性名稱,並將<LocCanonicalName>更新為命令的技術名稱 — 當使用者在工具>選項>環境>鍵盤對話方塊中將自訂鍵盤快捷鍵指派給命令時,這個名稱會顯示出來。
<Button guid="InsertGuid" id="MyCommand" priority="0x0100" type="Button">
<Parent guid="InsertGuid" id="MyMenuGroup" />
<Icon guid="ImageCatalogGuid" id="PasteAppend" />
<CommandFlag>IconIsMoniker</CommandFlag>
<Strings>
<ButtonText>Insert GUID</ButtonText>
<LocCanonicalName>.Edit.InsertGuid</LocCanonicalName>
</Strings>
</Button>
備註
一律以點字元開頭 <LocCanonicalName> 。 它確保不會自動附加其他文字,也不會顯示小點。
您可以使用 Visual Studio 影像程式庫中提供的數千個圖示,甚至可以取得 IntelliSense 中顯示的預覽:
現在,您已更新命令的名稱、圖示和位置,是時候撰寫一些程式碼,將 guid 插入文字編輯器。
開啟 /Commands/MyCommand.cs 檔案,並修改它,以在執行時插入新的 GUID:
using System;
using Community.VisualStudio.Toolkit;
using EnvDTE;
using Microsoft.VisualStudio.Shell;
using Task = System.Threading.Tasks.Task;
namespace InsertGuid
{
[Command(PackageIds.MyCommand)]
internal sealed class MyCommand : BaseCommand<MyCommand>
{
protected override async Task ExecuteAsync(OleMenuCmdEventArgs e)
{
await Package.JoinableTaskFactory.SwitchToMainThreadAsync();
DocumentView docView = await VS.Documents.GetActiveDocumentViewAsync();
if (docView?.TextView == null) return;
SnapshotPoint position = docView.TextView.Caret.Position.BufferPosition;
docView.TextBuffer?.Insert(position, Guid.NewGuid().ToString());
}
}
}
您正在使用 VS 物件來取得活動中的編輯器文字檢視,然後在其文字緩衝區的游標位置插入 GUID。
VS是靜態物件,可提供對 Visual Studio IDE UI 元素的存取;請參閱 VSIX 社群工具組 GitHub 存放庫中 VS.cs 中的定義。
備註
您將在此社區工具包的許多地方看到 await JoinableTaskFactory.SwitchToMainThreadAsync() 和 ThreadHelper.ThrowIfNotOnUIThread() 。 它們處理執行緒切換最佳實踐,您此時不需要知道何時以及如何使用它們 - 帶有程式碼修復(燈泡)的編譯器警告使這變得超級簡單。
我們擴展的初稿現已完成,是時候對其進行測試了。
執行和偵錯
執行延伸模組就像執行任何其他 .NET 專案一樣簡單。 只需按 F5 即可在附加偵錯器的情況下運行,或按 Ctrl+F5 即可在不附加調試器的情況下運行。
這樣做會啟動已安裝延伸模組的 Visual Studio 實驗實例。 實驗實例是 Visual Studio 的一般版本,但已安裝個別的設定和延伸模組。 它有助於將事物分開。
當實驗執行個體啟動時,您應該會在 [編輯] 主功能表中看到 [插入 GUID] 命令。
開啟任何文字型檔案,然後執行命令以插入新的 GUID。 就是這樣!
總結
您現在已經建立了第一個擴展,該擴展將命令按鈕添加到主菜單並在執行時與文本編輯器交互。
恭喜!!
您可以在 範例存放庫中找到此擴充功能的程式碼。