Visual studio 2010 VSTO MS Project 2007加载项按钮事件在几分钟后停止触发

Visual studio 2010 VSTO MS Project 2007加载项按钮事件在几分钟后停止触发,visual-studio-2010,vsto,ms-project,Visual Studio 2010,Vsto,Ms Project,我正在编写一个MS Project 2007插件(VS 2010,WinXP),它创建一个带有按钮的工具栏,并为所述按钮分配一个HelloWorld onclick事件处理程序 问题 安装后,插件创建按钮,连接点击事件,一切正常。然而,几分钟后,onclick事件莫名其妙地停止了触发 我读到的每一篇文章都说我需要在全局范围内定义我的工具栏/按钮,我已经这样做了。但是,onclick事件在运行几分钟后仍然会被取消挂钩 我遇到的另一个奇怪的症状是,当我在COM加载项对话框中切换它时(在它停止工作后)

我正在编写一个MS Project 2007插件(VS 2010,WinXP),它创建一个带有按钮的工具栏,并为所述按钮分配一个HelloWorld onclick事件处理程序

问题 安装后,插件创建按钮,连接点击事件,一切正常。然而,几分钟后,onclick事件莫名其妙地停止了触发

我读到的每一篇文章都说我需要在全局范围内定义我的工具栏/按钮,我已经这样做了。但是,onclick事件在运行几分钟后仍然会被取消挂钩

我遇到的另一个奇怪的症状是,当我在COM加载项对话框中切换它时(在它停止工作后),我收到以下奇怪的消息:

“无法使用与其基础RCW分离的com对象”

…这很奇怪,因为在这个简单的应用程序中,我没有释放任何COM对象

有什么建议吗


代码
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml.Linq;
使用MSProject=Microsoft.Office.Interop.MSProject;
使用Office=Microsoft.Office.Core;
命名空间测试\u Project2007\u加载项
{
公共部分类ThisAddIn
{
private Office.CommandBar cmdBar;//Hello World工具栏
private Office.CommandBarButton cmdBtn01;//Hellow World按钮
私有字符串cmdBarName=“Hello World Toolbar”;
私有字符串cmdBtn01Name=“HelloWorld”;
私有void ThisAddIn_启动(对象发送方,System.EventArgs e){
//定义工具栏
cmdBar=this.Application.commandbar.Add(
cmdBarName、Office.MsoBarPosition.msoBarTop、false、true);
cmdBar.Visible=true;
//定义按钮
cmdBtn01=cmdBar.Controls.Add(Office.MsoControlType.msoControlButton,missing,missing,missing,true)为Office.CommandBarButton;
cmdBtn01.FaceId=422;
cmdBtn01.Caption=“你好,世界”;
cmdBtn01.Tag=cmdBtn01Name;
cmdBtn01.DescriptionText=“Hello World”;
cmdBtn01.TooltipText=“Hello World”;
cmdBtn01.Click+=新建Microsoft.Office.Core.\u命令按钮事件\u ClickEventHandler(HelloWorld);
}
私有void ThisAddIn_关闭(对象发送方,System.EventArgs e){
}
私有void HelloWorld(Microsoft.Office.Core.CommandBarButton barButton,ref bool someBool){
System.Windows.Forms.MessageBox.Show(“你好,世界!”);
}
#区域VSTO生成的代码
/// 
///设计器支持所需的方法-不修改
///此方法的内容与代码编辑器一起使用。
/// 
私有void InternalStartup()
{
this.Startup+=new System.EventHandler(ThisAddIn\u启动);
this.Shutdown+=new System.EventHandler(ThisAddIn\u Shutdown);
}
#端区
}
}

尝试将
命令栏添加为私有成员变量。可能
commandbar
正在收集垃圾。看看这是否解决了你的RCW问题-如果不是,它可能是另一个插件

如果这不起作用,可以尝试使
应用程序成为本地成员。抱歉-我没有MS Project来测试这个

private-commandbar cmdbar;//应用程序命令栏
私有void ThisAddIn_启动(对象发送方,System.EventArgs e){
//..
cmdbar=this.Application.commandbar;
cmdBar=cmdBar.Add(cmdBarName,Office.MsoBarPosition.msoBarTop,false,true);
//..
}
试试这个:

cmdBar = this.Application.ActiveExplorer().CommandBars.Add(
而不是:

cmdBar = this.Application.CommandBars.Add(

非常感谢你的建议。现在一切都很好。为了防止其他人读到这篇文章,我不需要本地化对应用程序类的引用。将字段设置为私有就可以了。
ActiveExplorer
是Outlook对象,而不是MS Project对象。