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

时间:2016-07-13 08:02:07

标签: visual-studio visual-studio-extensions project-reference

我正在开发一个Visual Studio扩展,我在其中向项目中引用的右键单击(上下文)菜单添加元素。这是通过使用Group的父级定义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开头,我想显示菜单。我该怎么做?

我觉得我被困在interop hell地狱中,盲目地绊倒了任意的ids,guids和不存在/难以理解的文档。

我设法将我的引用项目作为IVsProject和一些id作为参考,但是调用GetMkDocument不返回任何内容(它适用于项目中的文件但不适用于引用)。

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

1 个答案:

答案 0 :(得分:3)

终于明白了。一旦你拥有所选项目的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 );
}