共用方式為


您的第一個 Visual Studio 延伸模組

本文會逐步引導您完成一些簡單的步驟,以啟動並執行您的第一個 Visual Studio 延伸模組。 Visual Studio 延伸模組是使用 .NET Framework 和 C# 撰寫。 如果您已經是 .NET 開發人員,您會發現編寫擴展與編寫大多數其他 .NET 程式和庫類似。

您今天要撰寫的擴充功能將新增一個命令,執行時會將新的 GUID 插入文字編輯器。 它簡單、有用,並且很好地介紹了擴展開發的各個方面。

如果您是視覺型學習者,請觀看此段簡短影片,顯示有人如何遵循教學課程。

在開始編寫您的第一個 Visual Studio 擴展之前(這很容易,我保證!),請確保您擁有 所需的工具

建立專案

有多個項目模板可供選擇,因此您需要做出正確的選擇。 此社群工具組中使用的範本,名稱中都有暱稱 (社群)

VSIX 專案 w/Command(社群) 範本已整合了一個命令,使您能夠輕鬆地從此處開始。 對於大多數擴展來說,這是一個很好的起點。 如果您知道需要工具視窗,請使用 VSIX 專案 w/工具視窗 (社群) 範本。 它還有一個用於打開工具窗口的命令。

空白 VSIX 專案 (社群)VSIX 專案 (社群) 範本用於僅限 MEF 的延伸模組或其他進階案例。

這次,您將選取 VSIX 專案 w/命令 (社群) 範本,如下列螢幕擷取畫面所示。

顯示 VSIX 專案範本的 [新增專案] 對話方塊。

選擇專案範本後,您需要為您的專案命名。 將其稱為 InsertGuid

設定您的新專案。

點擊“ 創建 ”按鈕後,您應該最終會得到一個基本的 VSIX 項目,如下所示:

新的專案檔案和資料夾。

重要檔案

讓我們回顧一下最重要的文件。

InsertGuidPackage.cs 就是所謂的 Package 類別。 Visual Studio 會呼叫其 InitializeAsync(...) 方法來初始化您的延伸模組。 您可以從這裡添加事件偵聽器並註冊命令、工具窗口、設置和其他內容。

source.extension.vsixmanifest 是延伸模組的資訊清單檔案。 它包含標題和描述等元數據,但也包含有關擴充功能包含的內容的資訊。

VSCommandTable.vsct 是一個 XML 檔案,其中命令和按鍵繫結是以宣告方式定義的,因此可以向 Visual Studio 註冊它們。

Commands/MyCommand.csVSCommandTable.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 來協助選擇合適的位置,使您輕鬆找到正確的地點。

VSCT 父系 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 中顯示的預覽:

VSCT 圖示 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 命令。

開啟任何文字型檔案,然後執行命令以插入新的 GUID。 就是這樣!

總結

您現在已經建立了第一個擴展,該擴展將命令按鈕添加到主菜單並在執行時與文本編輯器交互。

恭喜!!

您可以在 範例存放庫中找到此擴充功能的程式碼。