2009-07-28 132 views
0

我使用這個代碼添加到代碼窗口中的項目右鍵菜單:VS2008加載項添加到菜單

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()和後來的東西在一個如果只執行如果按鈕不存在,但我似乎無法找到一種方法來檢查這在API中?

回答

1

我記得在其他地方看到這個問題,原因是OnConnection方法可以由於多種原因多次調用(使用不同的connectMode值),所以有一些欺騙(或特性,取決於你如何看待在它和你知道多少這個)參與。

不過,我不是這方面的專家,所以這裏有一些鏈接,幫助你:

HOWTO: Use correctly the OnConnection method of a Visual Studio add-in

HOWTO: Adding buttons, commandbars and toolbars to Visual Studio .NET from an add-in

HOWTO: Controlling the state of command in a Visual Studio add-in

這些都是有點太在這裏總結一下(至少對我來說似乎是這樣),但他們確實有你需要的信息。

而且,這裏是文章寫作上的加載項VS,這可能將是非常有益的列表: http://www.mztools.com/resources_vsnet_addins.aspx

HTH。


編輯:錢J的回答是更重要的點位,我想,而且基本上你需要做什麼很短總結,如果這就是你以後就是 - 偉大的。不過,我相信我提供鏈接的頁面上所包含的信息非常有用,因此您可能也想閱讀這些信息。

+0

我會勉強做一個短期修復,然後在我得到時間時深入研究這些信息。我能找到的大部分內容都是用這種叫做vb.net的可怕語言來處理的,這個語言並不是很有用,所以謝謝。 – ewanm89 2009-09-19 20:55:56

+0

明天我會檢查它的工作,或者我有時間的星期一,明天就這樣去做。很多包裝要做。 – ewanm89 2009-09-19 20:57:09

+0

謝謝,這些鏈接與這一個很大的幫助:http://www.mztools.com/articles/2006/MZ2006014.aspx – ewanm89 2009-09-25 01:23:15

0

我沒有寫爲2008年之前的VS.NET插件,但看到你有什麼可以用你的方法:

檢查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

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 
}