【问题标题】:VS2008 Addin add to menuVS2008 Addin 添加到菜单
【发布时间】:2009-07-28 14:43:44
【问题描述】:

我正在使用此代码向代码窗口右键菜单中添加一项:

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 中检查此内容的方法?

【问题讨论】:

    标签: c# visual-studio-2008 add-in visual-studio-addins


    【解决方案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。


    编辑:我想,Money J 的回答更中肯,基本上是对您需要做的事情的非常简短的总结,如果这就是您所追求的 - 太好了.但是,我相信我提供链接的页面上包含的信息非常有用,因此您可能也想阅读。

    【讨论】:

    • 我会做一个短期修复,然后在有时间的时候深入研究该信息。我能找到的大部分内容都是用一种被称为 vb.net 的可怕语言来处理的,这种语言不太有用,所以谢谢。
    • 明天我会检查它是否有效,或者星期一我有时间时,明天移动。很多打包工作要做。
    • 谢谢,这些链接和这个链接一起帮了大忙:mztools.com/articles/2006/MZ2006014.aspx
    【解决方案2】:

    我以前没有为 VS.NET 2008 编写过插件,但是看看你的方法有什么可用的:

    检查 ext_cm_UISetup?

     if(connectMode == ext_ConnectMode.ext_cm_UISetup)
        {
    

    另外,在您的 try 块中,您应该能够使用资源管理器...

     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

    【讨论】:

    • 我以这里建议的所有方式尝试了 connectMode 的东西,但它们最终都意味着我根本没有菜单项......
    • 我仍在尝试查看 ResourceManager 代码甚至试图做什么,以及它与我的变量名的关系。
    【解决方案3】:

    尝试改变:

    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
    }
    

    【讨论】:

    • 好的,您是否同时添加了connectMode检查? OnConnection 可以在不同的上下文中多次调用,并且根据 .addin 文件中的 LoadBehaviour/CommandPreload 设置,其行为也会有所不同...
    • 我以这里建议的所有方式尝试了 connectMode 的东西,但它们最终都意味着我根本没有菜单项......加载行为是在 VS2008 启动时开始。
    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多