1

プロジェクト内の参照の右クリック (コンテキスト) メニューに要素を追加する 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。どうすればいいですか?

任意の ID、GUID、および存在しない/理解できないドキュメントにやみくもにつまずく相互運用地獄に閉じ込められているように感じます。

参照が含まれているプロジェクトを参照の id として掘り出すことができましたIVsProjectが、呼び出しGetMkDocumentても何も返されません (プロジェクト内のファイルでは機能しますが、参照では機能しません)。

どうすればいいですか?これを行う方法に関するドキュメントはどこにありますか?

4

1 に答える 1

4

最後にそれを手に入れました。選択した項目の 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 );
}
于 2016-07-14T14:20:12.410 に答える