visual studio插件開發-Menu

工欲善其事,必先利其器,作為程序員我們很大部分時間在和ide打交道,好的插件可以大大提高我們的編程效率 , 我開發過幾個vs插件來解決一鍵生成dbmodels,快速部署到服務器,總結下來最關鍵的還是對于Menu這塊的擴展 , 因為這是插件功能的最常見的入口之一,下面給大家介紹vs插件各種menu的擴展
環境準備這里我使用vs2022版本 , 要開發vs插件的話,需要vs安裝插件開發模塊
打開vs 然后點擊 工具 -> 獲取工具和功能

visual studio插件開發-Menu

文章插圖
然后勾選Visual Studio擴展開發
visual studio插件開發-Menu

文章插圖
小試牛刀安裝好之后,打開vs就可以選擇到 vsix project 模板了

visual studio插件開發-Menu

文章插圖
image
我們利用vsix project模板創建一個插件工程

visual studio插件開發-Menu

文章插圖
image

visual studio插件開發-Menu

文章插圖
image
  • MenuDemoVSIXPackage.cs(是插件的入口類)
  • source.extension.vsixmanifest(插件的描述 , 比如版本,說明等描述性配置的地方)
空的vsix project就創建成功了,我們添加一個command(菜單操作)

visual studio插件開發-Menu

文章插圖
image

visual studio插件開發-Menu

文章插圖
image
創建了一個Command會新增下面3個
  • 一個png (圖標)
  • 一個vsct (不管幾個Command都只會有一個這個文件 , 包含所有自定義菜單的配置)
  • TestCommand.cs (自定義菜單的命令 , 點擊菜單的執行操作邏輯在里面)

visual studio插件開發-Menu

文章插圖
image
點擊啟動這個插件,會打開一個有插件環境的vs(隔離的)
會看到我們的Command名稱:Invoke TestCommand按鈕在vs的[工具]這個菜單里面,點擊它會出一個彈框,如下
visual studio插件開發-Menu

文章插圖
好了,以上完成初體驗后,回到本文要重點介紹:vs的Menu擴展
vs的Menu擴展上面我們說到 vsct文件 , 我們的按鈕是展示在Vs哪種類型的Menu下 , 就是在這個文件定義的,我們一起看下這個vsct文件,關鍵部分我都用不同顏色來高亮顯示

visual studio插件開發-Menu

文章插圖
image
CommandTable 表示與VSPackage關聯的所有命令、菜單組和菜單 。Extern 表示引用外部.h文件,最終會與.vsct文件合并的
  • stdidcmd.h
  • vsshlids.h
VSCT 編譯器能使用 C++ 宏和預處理,通過extern引入頭文件,比如vsshlids.h vsshlids.h 頭文件位于
{VS安裝目錄}\VSSDK\VisualStudioIntegration\Common\Inc , 
例如我的目錄是
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VSSDK\VisualStudioIntegration\Common\Inc
vsct 文件中有用到宏 IDM_VS_MENU_TOOLS = 0x0005,
它表示 VS 上的 Tools 菜單的ID,這個宏即位于 vsshlids.h 頭文件中 。
如果不引入這個頭文件,那么就得寫0x0005,導致可讀性很差和難維護!

visual studio插件開發-Menu

文章插圖
image
Commands 表示可以執行命令的集合 。每個命令都有以下四個子元素:
  • Menus 是菜單/工具欄的集合 。菜單是Commands的容器 。
  • Groups 決定菜單的位置
  • Buttons 表示命令按鈕/菜單項
  • Bitmaps 按鈕/菜單項的圖標配置
CommandPlacements 指示各個命令應位于VSPackage菜單中的其他位置 。Symbols 包含包中所有命令的符號名和GUID, ID 。KeyBindings 快捷鍵指定 例如Ctrl+S 。以上vsct的xml scheme 的詳細說明在這里有文檔
https://github.com/MicrosoftDocs/visualstudio-docs/blob/main/docs/extensibility/internals/designing-xml-command-table-dot-vsct-files.md
一級菜單<Groups>  <Group guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup" priority="0x0600">    <!-- 這個guid和id決定了菜單的位置 -->    <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>  </Group></Groups>

推薦閱讀