0

このコードを使用して、コードウィンドウの右クリックメニューに項目を追加しています。

public void OnConnection(
 object application, 
 ext_ConnectMode connectMode, 
 object addInInst, 
 ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;

    object[] contextGUIDS = new object[] { };
    Command codeWindowCommand = null;
    CommandBarControl codeWindowButton;
    CommandBar codeCommandBar;
    CommandBars commandBars;

    try
    {
        codeWindowCommand = _applicationObject.Commands.Item(
            _addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, 0);
    }
    catch
    {
    }

    if (codeWindowCommand == null)
    {
        codeWindowCommand = _applicationObject.Commands.AddNamedCommand(
            _addInInstance, 
            CODEWINDOW_COMMAND_NAME, 
            CODEWINDOW_COMMAND_NAME, 
            "Pastebin selected code", 
            true, 
            18, 
            ref contextGUIDS, 
            (int)vsCommandStatus.vsCommandStatusSupported + 
            (int)vsCommandStatus.vsCommandStatusEnabled);
    }

    commandBars = (CommandBars)_applicationObject.CommandBars;

    codeCommandBar = commandBars["Code Window"];

    codeWindowButton = (CommandBarControl)codeWindowCommand.AddControl(
        codeCommandBar, codeCommandBar.Controls.Count + 1);
    codeWindowButton.Caption = "Text for button";
    codeWindowButton.TooltipText = "Tooltip for button";
}

アドインは自動起動に設定されています。ただし、VS2008を実行するたびに、アドインを完全に削除するまで、メニューに別のボタンが追加されます。誰かが私がこれを修正する方法を知っていますか?

たとえば、Command.AddControl()以降は、ボタンがまだ存在しない場合にのみ実行されるifでラップしますが、APIでこれを確認する方法が見つからないようです。

4

3 に答える 3

1

この問題を別の場所で見たのを覚えています。その理由は、OnConnection メソッドが複数の理由 (connectMode の値が異なる) で複数回呼び出される可能性があるためです。これの多くはあなたが知っている)関与しています。

ただし、私はこのトピックの専門家ではないため、役立つリンクをいくつか紹介します

HOWTO: Visual Studio アドインの OnConnection メソッドを正しく使用する

HOWTO: アドインから Visual Studio .NET にボタン、コマンド バー、およびツールバーを追加する

HOWTO: Visual Studio アドインでコマンドの状態を制御する

これらはここで要約するにはやや長すぎます (少なくとも私にはそう思われます) が、必要な情報は含まれています。

また、VS アドインの作成に関する記事のリストは、おそらく非常に役立つでしょう: http://www.mztools.com/resources_vsnet_addins.aspx

HTH。


編集: Money J の回答はもう少し的を射ていると思いますが、基本的には、何をする必要があるかについての非常に短い要約です。ただし、リンク先のページに含まれる情報は非常に役立つと思いますので、そちらもお読みください。

于 2009-09-19T00:09:37.693 に答える
0

以前に VS.NET 2008 用のアドインを作成したことはありませんが、メソッドで利用できるものを確認します。

ext_cm_UISetup を確認しますか?

 if(connectMode == ext_ConnectMode.ext_cm_UISetup)
    {

また、try ブロックでは、resourcemanager を使用できるはずです...

 ResourceManager resourceManager = new     
          ResourceManager("MyAddin1.CommandBar",  
          Assembly.GetExecutingAssembly());
        CultureInfo cultureInfo = new 
          System.Globalization.CultureInfo
          (_applicationObject.LocaleID);
        string resourceName = String.Concat(cultureInfo.
          TwoLetterISOLanguageName, "Tools");
        toolsMenuName = resourceManager.GetString(resourceName);

そして、将来役立つかもしれない便利な図。

http://msdn.microsoft.com/en-us/library/za2b25t3.aspx

于 2009-09-19T00:12:00.760 に答える
0

変更してみてください:

codeWindowCommand = _applicationObject.Commands.Item(_addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, 0); 

...に:

codeWindowCommand = _applicationObject.Commands.Item(_addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, -1); 

...そして全体を次のようにラップします:

#if DEBUG
if (connectMode == ext_ConnectMode.ext_cm_UISetup)
#else
if (connectMode == ext_ConnectMode.ext_cm_Startup || connectMode == ext_ConnectMode.ext_cm_AfterStartup)
#endif
{
    //add-in startup code goes here
}
于 2009-09-19T03:02:26.627 に答える