2009-07-28 93 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 
}