web-dev-qa-db-ja.com

Visual Studio 2010プラグイン-ソリューションエクスプローラーへのコンテキストメニューの追加

Visual Studio 2010のソリューションエクスプローラーの特定のファイルの種類のコンテキストメニューに新しいオプションを追加したいと思います。たとえば、*。csファイルを右クリックすると、既存のコンテキストメニューと「新しいオプション」が表示されます。

私はコードがどのように見えるのかと思っています。また、ビジュアルスタジオプラグインを開発するための優れたリファレンスへのポインタも必要です。私が見ているチュートリアル/リファレンスはひどく恐ろしいです。

ありがとう!

46
Kenn

これを行うのに約5時間かかりました。

Visual Studioアドイン(または共有アドイン)とVisual Studioパッケージの2つのオプションがあります。

このパッケージははるかに複雑であり、はるかに制御しやすくなっていますが、ソリューションエクスプローラーのコンテキストメニューの場合は必要ありません。

つまり、新しいプロジェクト->他のプロジェクトタイプ->拡張性-> Visual Studioアドインです。

これがウォークスルーです- Link

また、これは私がいくつかフォローした- Link

コンテキストメニューが機能するようになるまで、または[ツール]-> [オプション]ページを作成しない場合は、設定ダイアログを配置する場所を提供するまで、ツールメニューに追加するオプションを残すことをお勧めします。

接続コードは次のとおりです。

  _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
        if (connectMode == ext_ConnectMode.ext_cm_UISetup)
        {
            object[] contextGUIDS = new object[] { };
            Commands2 commands = (Commands2)_applicationObject.Commands;
            string toolsMenuName = "Tools";

            //Place the command on the tools menu.
            //Find the MenuBar command bar, which is the top-level command bar holding all the main menu items:
            Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

            //Find the Tools command bar on the MenuBar command bar:
            CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
            CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
            // get popUp command bars where commands will be registered.
            CommandBars cmdBars = (CommandBars)(_applicationObject.CommandBars);
            CommandBar vsBarItem = cmdBars["Item"]; //the pop up for clicking a project Item
            CommandBar vsBarWebItem = cmdBars["Web Item"];
            CommandBar vsBarMultiItem = cmdBars["Cross Project Multi Item"];
            CommandBar vsBarFolder = cmdBars["Folder"];
            CommandBar vsBarWebFolder = cmdBars["Web Folder"];
            CommandBar vsBarProject = cmdBars["Project"]; //the popUpMenu for right clicking a project
            CommandBar vsBarProjectNode = cmdBars["Project Node"];

            //This try/catch block can be duplicated if you wish to add multiple commands to be handled by your Add-in,
            //  just make sure you also update the QueryStatus/Exec method to include the new command names.
            try
            {
                //Add a command to the Commands collection:
                Command command = commands.AddNamedCommand2(_addInInstance, "HintPaths", "HintPaths", "Executes the command for HintPaths", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

                //Add a control for the command to the tools menu:
                if ((command != null) && (toolsPopup != null))
                {
                    //command.AddControl(toolsPopup.CommandBar, 1);
                    command.AddControl(vsBarProject); 
                }
            }
            catch (System.ArgumentException argEx)
            {
                System.Diagnostics.Debug.Write("Exception in HintPaths:" + argEx.ToString());
                //If we are here, then the exception is probably because a command with that name
                //  already exists. If so there is no need to recreate the command and we can 
                //  safely ignore the exception.
            }
        }
    }

このコードは、ユーザーが選択したものが、たとえばプロジェクトであるかどうかを確認します。

  private Project GetProject()
    {
        if (_applicationObject.Solution == null || _applicationObject.Solution.Projects == null || _applicationObject.Solution.Projects.Count < 1)
            return null;
        if (_applicationObject.SelectedItems.Count == 1 && _applicationObject.SelectedItems.Item(1).Project != null)
            return _applicationObject.SelectedItems.Item(1).Project;
        return null;
    }

コード内の特定の文字列名は一致する必要があることに注意してください。昨日これを行ったばかりなので、どの文字列がまだ完全に一致しているかはわかりません。

32
Maslow

最善の方法は、Visual StudioアドインではなくVisual Studioパッケージを作成することでした。 vsixの導入エクスペリエンスは非常に洗練されています-すべてが本当に簡単なエクスペリエンスでした。 Visual Studio 2010のみをサポートしていますが、私の場合はそれで十分でした。

結果のvsctは次のとおりです。

<Commands package="guidBingfooPluginPkg">
    <Groups>
      <Group guid="guidBingfooPluginCmdSet" id="MyMenuGroup" priority="0x0600">
        <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>
      </Group>
    </Groups>

    <Buttons>
      <Button guid="guidBingfooPluginCmdSet" id="cmdidfooLocalBox" priority="0x0100" type="Button">
        <Parent guid="guidBingfooPluginCmdSet" id="MyMenuGroup" />
        <!-- <Icon guid="guidImages" id="bmpPic1" /> -->
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <CommandName>cmdidfooLocalBox</CommandName>
          <ButtonText>View in foo</ButtonText>
        </Strings>
      </Button>

      <Button guid="guidBingfooPluginCmdSet" id="cmdidfooTestBed" priority="0x0100" type="Button">
        <Parent guid="guidBingfooPluginCmdSet" id="MyMenuGroup" />
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <CommandName>cmdidfooTestBed</CommandName>
          <ButtonText>View in foo on Test Beds</ButtonText>
        </Strings>
      </Button>

    </Buttons>

    <Bitmaps>
      <Bitmap guid="guidImages" href="Resources\Images_32bit.bmp" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
    </Bitmaps>
  </Commands>

  <Symbols>
    <GuidSymbol name="guidBingfooPluginPkg" value="{62c4a13c-cc61-44a0-9e47-33111bd323ce}" />

    <GuidSymbol name="guidBingfooPluginCmdSet" value="{59166210-d88c-4259-9809-418bc332b0ab}">
      <IDSymbol name="MyMenuGroup" value="0x1020" />
      <IDSymbol name="cmdidfooLocalBox" value="0x0100" />
      <IDSymbol name="cmdidfooTestBed" value="0x0101" />
    </GuidSymbol>

    <GuidSymbol name="guidImages" value="{2dff8307-a49a-4951-a236-82e047385960}" >
      <IDSymbol name="bmpPic1" value="1" />
      <IDSymbol name="bmpPic2" value="2" />
      <IDSymbol name="bmpPicSearch" value="3" />
      <IDSymbol name="bmpPicX" value="4" />
      <IDSymbol name="bmpPicArrows" value="5" />
    </GuidSymbol>
  </Symbols>
</CommandTable>
16
Kenn

UPDATE:

GAX/GAT for VS2010は http://msdn.Microsoft.com/en-us/library/ff68717 からも入手できます。

元の投稿

VSは本当に複雑なので、まあ恐ろしいです。 GAX/GATの使用は可能でしたが、 VS2010バージョンはまだありません があります。私が提案するのは Visual Studio Gallery からいくつかのサンプルをダウンロードして、全体の仕組みを理解しようとすることですが、残念ながら簡単な作業ではありません。

HTH

3
Marcote

私はコードエディターウィンドウのコンテキストメニューにアイテムを追加する必要があることに気づきました。これは、JavaScriptファイル専用に必要なcmdBars["Script Context"]になりました。

これを見つけるためのテクニックとして、共有が便利だと感じたので、次のループを使用して、Visual Studioのすべての(456)メニューコントロールに新しいメニュー項目を追加しました。

foreach (CommandBar cc in cmdBars)
{
    if (cc.Index >= 1 && cc.Index <= 456)
    {
        command.AddControl(cmdBars[cc.NameLocal]);
    }
}

次に、ループの境界を調整することにより、分割統治手法を使用してこれを狭めました。

    if (cc.Index >= 1 && cc.Index <= 256)
    ...
    if (cc.Index >= 1 && cc.Index <= 128)
    ...
    if (cc.Index >= 64 && cc.Index <= 128)
    ...etc...

最終的には探していたものが見つかるまで。

(これに関連する質問は Visual Studio 2010プラグイン-エディターウィンドウへのコンテキストメニューの追加 )にあります

2
James Wiseman