找出在 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 );
}
我正在开发一个 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 );
}