共用方式為


您的第一個 Visual Studio 擴充功能

本文將引導您完成一些簡單的步驟,來啟動並執行您的第一個 Visual Studio 擴充功能。 Visual Studio 擴充功能是使用 .NET Framework 和 C# 寫入。 如果您已經是 .NET 開發人員,您會發現寫入擴充功能類似於寫入大部分其他 .NET 程式和程式庫。

您今天要寫入的擴充功能會新增命令,以在執行時將新的 guid 插入文字編輯器中。 它簡單、實用,為擴充功能的各個方面提供了很好的介紹。

如果您是視覺效果學習者,請觀看某人遵循本教學的這段短片。

開始寫入您的第一個 Visual Studio 擴充功能之前,請先確定您有所需的工具

建立專案

有多種專案範本可供選擇,因此您需要做出正確的選擇。 此社群工具組中所使用的範本,全都有名稱中的 Moniker (Community)

VSIX Project w/Command (Community) 範本隨附連結的命令,可讓您輕鬆地從該處開始。 這是大部分擴充功能的絕佳起點。 如果您知道自己想要工具視窗,請使用 VSIX Project w/Tool Window (Community) 範本。 它也有開啟工具視窗的命令。

如果是僅限 MEF 的擴充功能或其他進階案例,請使用 Empty VSIX Project (Community)VSIX Project (Community) 範本。

此時,請選取 VSIX Project w/Command (Community) 範本,如下列螢幕擷取畫面所示。

New Project Dialog showing VSIX project templates.

選取專案範本之後,您必須為專案指定名稱。 將其命名為 InsertGuid

Configure your new project.

按下建立按鈕之後,您應該會看到如下所示的基本 [VSIX 專案]:

New project files and folders.

重要檔案

讓我們來看看最重要的檔案。

InsertGuidPackage.cs 稱為 [套件] 類別。 Visual Studio 會呼叫其 InitializeAsync(...) 方法來初始化擴充功能。 您可以從這裡新增事件接聽程式和登錄命令、工具視窗、設定和其他事項。

source.extension.vsixmanifest 是擴充功能的資訊清單檔案。 它包含中繼資料,例如標題和描述,但也包含擴充功能所包含的資訊。

VSCommandTable.vsct 是 XML 檔案,其中命令和索引鍵繫結是以宣告方式定義,因此可以將其註冊到 Visual Studio。

Commands/MyCommand.csVSCommandTable.vsct 檔案中定義之命令的命令處理常式。 透過按一下按鈕,它就會控制命令執行時會發生什麼事。

修改命令

首先,您想要確定命令在 Visual Studio 功能表系統中具有正確的名稱、圖示和位置。

開啟 VSCommandTable.vsct 檔案並尋找 <Group><Button>。 注意按鈕如何將群組指定為其上層,而群組的上層是內建的 VSMainMenu/Tools 功能表。

針對擴充功能,您希望插入 GUID 命令按鈕位於編輯主選單下,因此您要將群組重新連接到 [編輯] 功能表。 將工具取代為編輯,如下列片段所示:

<Group guid="InsertGuid" id="MyMenuGroup" priority="0x0600">
  <Parent guid="VSMainMenu" id="Edit"/>
</Group>

您可以取得完整的 IntelliSense 位置,讓操作變得更輕鬆。

VSCT parent IntelliSense.

<Button> 也需要更新。 您將藉由將 <Icon> 項目的 id 屬性更新為 PasteAppend,為其提供新的圖示。 以良好的描述性名稱更新 <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 icon 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 插入其文字緩衝區插入號位置。

注意

您將在此社群工具組的許多位置看到 await JoinableTaskFactory.SwitchToMainThreadAsync()ThreadHelper.ThrowIfNotOnUIThread()。 它們會處理執行緒切換最佳做法,您目前不需要知道何時及如何使用它們 - 帶有 [程式碼修正] (燈泡) 的編譯器警告使這變得非常簡單。

擴充功能的初稿現在已完成,是時候對其進行測試了。

執行和偵錯

執行擴充功能就像執行任何其他 .NET 專案一樣簡單。 只需按 F5 即可在附加偵錯工具的情況下執行,或按 Ctrl+F5 在不附加偵錯工具的情況下執行。

這麼做將會啟動已安裝擴充功能的 Visual Studio [實驗執行個體]。 [實驗執行個體] 是 Visual Studio 的一般版本,但已安裝個別的設定和擴充功能。 它有助於將事情分開。

當 [實驗執行個體] 啟動時,您應該會在編輯主功能表中看到插入 GUID 命令。

Insert GUID command located in the Edit main menu.

開啟任何以文字為基礎的檔案,然後執行命令以插入新的 guid。 介紹完畢

摘要

您現在已建立第一個擴充功能,將命令按鈕新增至主功能表,並在執行時與文字編輯器互動。

恭喜!

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