You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio扩展开发:为引用的NuGet包添加右键菜单动作

在VS扩展中给NuGet包右键菜单添加自定义命令

步骤1:获取NuGet包右键菜单的组ID

常规的Tools>Customize找不到NuGet相关组ID,直接用NuGet官方预定义的命令集信息即可:

  • NuGet命令集GUID:{5EFC7975-14BC-11CF-9B2B-00AA00573819}
  • NuGet包上下文菜单组ID:0x0200(对应常量IDG_NuGet_Package_ContextMenu)

更稳妥的方式是给扩展项目安装NuGet.VisualStudio NuGet包,直接引用预定义常量,避免手写GUID出错。

步骤2:配置.vsct文件

在扩展项目的.vsct文件中做以下修改:

  1. 添加NuGet命令集的GUID定义:
<GuidSymbol name="guidNuGetPackageManagerCmdSet" value="{5EFC7975-14BC-11CF-9B2B-00AA00573819}">
  <IDSymbol name="IDG_NuGet_Package_ContextMenu" value="0x0200"/>
</GuidSymbol>
  1. 修改自定义按钮配置,指定父菜单为NuGet包右键菜单:
<Button guid="guidYourExtensionCmdSet" id="cmdidYourCustomCommand" priority="0x0100" type="Button">
  <Parent guid="guidNuGetPackageManagerCmdSet" id="IDG_NuGet_Package_ContextMenu"/>
  <Strings>
    <ButtonText>你的自定义命令名称</ButtonText>
  </Strings>
</Button>

步骤3:在Command.cs中实现命令逻辑

  1. 在Initialize方法中注册命令,并绑定状态检查事件:
private void Initialize()
{
    var commandService = ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    if (commandService == null) return;

    var commandId = new CommandID(GuidList.guidYourExtensionCmdSet, (int)PkgCmdIDList.cmdidYourCustomCommand);
    var menuItem = new OleMenuCommand(MenuItemCallback, commandId);
    menuItem.BeforeQueryStatus += MenuItem_BeforeQueryStatus;
    commandService.AddCommand(menuItem);
}
  1. 实现BeforeQueryStatus方法,控制命令仅在选中NuGet包时显示:
private void MenuItem_BeforeQueryStatus(object sender, EventArgs e)
{
    var menuCommand = sender as OleMenuCommand;
    if (menuCommand == null) return;

    var selectionMonitor = ServiceProvider.GetService(typeof(SVsShellMonitorSelection)) as IVsMonitorSelection;
    if (selectionMonitor == null)
    {
        menuCommand.Visible = false;
        return;
    }

    IVsHierarchy hierarchy;
    uint itemId;
    selectionMonitor.GetCurrentSelection(out _, out hierarchy, out itemId, out _);

    bool isNuGetPackage = false;
    if (hierarchy != null && itemId != VSConstants.VSITEMID_NIL)
    {
        object itemTypeObj;
        hierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_ItemType, out itemTypeObj);
        if (itemTypeObj is string itemType && itemType.Equals("NuGetPackage", StringComparison.OrdinalIgnoreCase))
        {
            isNuGetPackage = true;
        }
    }

    menuCommand.Visible = isNuGetPackage;
    menuCommand.Enabled = isNuGetPackage;
}
  1. 实现命令回调逻辑(示例):
private void MenuItemCallback(object sender, EventArgs e)
{
    var selectionMonitor = ServiceProvider.GetService(typeof(SVsShellMonitorSelection)) as IVsMonitorSelection;
    IVsHierarchy hierarchy;
    uint itemId;
    selectionMonitor.GetCurrentSelection(out _, out hierarchy, out itemId, out _);
    
    object packageNameObj;
    hierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_Name, out packageNameObj);
    string packageName = packageNameObj as string;
    
    VsShellUtilities.ShowMessageBox(
        ServiceProvider,
        $"你选中了NuGet包:{packageName}",
        "自定义命令",
        OLEMSGICON.OLEMSGICON_INFO,
        OLEMSGBUTTON.OLEMSGBUTTON_OK,
        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
}

注意事项

  • 确保NuGet.VisualStudio包版本与目标VS版本兼容(比如VS2022对应6.x+版本)。
  • 若调试时命令不显示,可检查.vsct中的优先级设置,调整数值让命令在菜单中靠前显示。

内容的提问来源于stack exchange,提问作者CodingM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:02:02