1

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

我想根据单击的引用显示隐藏菜单元素,因此我将菜单项定义为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 和不存在/难以理解的文档而跌跌撞撞。

我已经设法挖掘出我的引用所在的项目作为引用的一个IVsProject和一些 id,但调用GetMkDocument不会返回任何内容(它适用于项目中的文件,但不适用于引用)。

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

4

1 回答 1

4

终于明白了。一旦您拥有所选项目的 IVsHierarchy 和 itemid,此行将在 out 参数中为您提供所需的名称。

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 );
}
于 2016-07-14T14:20:12.410 回答