找出在 Visual Studio 扩展中点击了哪个引用

Find out which reference is clicked in a Visual Studio extension

我正在开发一个 Visual Studio 扩展,我在其中将元素添加到项目中引用的右键单击(上下文)菜单中。这是通过用 IDM_VS_CTXT_REFERENCE.

的父项定义 Group 来完成的

我想根据单击的参考显示隐藏菜单元素,因此我将菜单项定义为 OleMenuCommand:

if (commandService != null)
{
    var menuCommandID = new CommandID(CommandSet, CommandId);
    var menuItem = new OleMenuCommand(this.MenuItemCallback, menuCommandID);

    menuItem.BeforeQueryStatus += (sender, args) =>
    {
        var button = (OleMenuCommand)sender;
        button.Visible = this.CommandVisible();
    };

    commandService.AddCommand(menuItem);
}

我在实施 CommandVisible 方法时遇到问题。举个例子,如果引用的名称以 A 开头,我想显示菜单。我该怎么做?

我感觉自己陷入了互操作地狱,盲目地为任意 ID、GUID 和 non-existant/incomprehensible 文档绊倒。

我已经设法挖掘出我的参考所在的项目作为一个 IVsProject 和一些参考 ID,但是调用 GetMkDocument returns 什么都没有(它适用于文件项目但没有参考)。

我该怎么做?我在哪里可以找到有关如何执行此操作的文档?

终于明白了。一旦你有了所选项目的 IVsHierarchy 和 itemid,这一行就会在输出参数中得到你想要的名称。

hierarchy.GetProperty(itemid, (int)__VSHPROPID.VSHPROPID_Name, out name);

完整代码

object name;
uint  itemid = VSConstants.VSITEMID_NIL;
IVsMultiItemSelect multiItemSelect = null;
IntPtr hierarchyPtr = IntPtr.Zero;
IntPtr selectionContainerPtr = IntPtr.Zero;
try
{
    var monitorSelection = Package.GetGlobalService( typeof( SVsShellMonitorSelection ) ) as IVsMonitorSelection;
    monitorSelection.GetCurrentSelection( out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainerPtr );
    hierarchy = Marshal.GetObjectForIUnknown( hierarchyPtr ) as IVsHierarchy;    
    hierarchy.GetProperty(itemid, (int)__VSHPROPID.VSHPROPID_Name, out name);
}finally
{
     if (selectionContainerPtr != IntPtr.Zero)
         Marshal.Release( selectionContainerPtr );

      if (hierarchyPtr != IntPtr.Zero)
          Marshal.Release( hierarchyPtr );
}