我正在使用此代码将项目添加到代码窗口右键菜单中:
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中检查这个的方法吗? / p>
答案 0 :(得分: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的答案有点重要,我想,基本上是你需要做的非常简短的总结,如果这就是你所追求的 - 那很棒。但是,我相信我提供链接的页面上包含的信息非常有用,所以您可能也想阅读它。
答案 1 :(得分: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);
一个方便的图表可能有助于将来。
答案 2 :(得分: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
}