我正在编写一个MS Project 2007加载项(VS 2010,WinXP(,该加载项创建一个带按钮的工具栏,并将HelloWorld onclick事件处理程序分配给该按钮。
问题所在
安装后,插件会创建按钮,连接单击事件,一切正常。 但是,几分钟后,onclick 事件莫名其妙地停止触发。
我读到的所有内容都说我需要在全局范围内定义我的工具栏/按钮,我已经做到了。 但是,onclick 事件在运行几分钟后仍会解除挂钩。
我遇到的另一个奇怪的症状是,当我在COM加载项对话框中切换它时(在其停止工作后(,我收到以下奇怪的消息:
"不能使用已与其基础 RCW 分离的 com 对象">
。这很奇怪,因为在这个简单的应用程序中,我没有发布任何COM对象。
有什么建议吗?
<小时 />《守则》
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using MSProject = Microsoft.Office.Interop.MSProject;
using Office = Microsoft.Office.Core;
namespace Test_Project2007_Addin
{
public partial class ThisAddIn
{
private Office.CommandBar cmdBar; // Hello World Toolbar
private Office.CommandBarButton cmdBtn01; // Hellow World Button
private string cmdBarName = "Hello World Toolbar";
private string cmdBtn01Name = "HelloWorld";
private void ThisAddIn_Startup( object sender, System.EventArgs e ) {
// Define the toolbar
cmdBar = this.Application.CommandBars.Add(
cmdBarName, Office.MsoBarPosition.msoBarTop, false, true );
cmdBar.Visible = true;
// Define the button
cmdBtn01 = cmdBar.Controls.Add( Office.MsoControlType.msoControlButton, missing, missing, missing, true ) as Office.CommandBarButton;
cmdBtn01.FaceId = 422;
cmdBtn01.Caption = "Hello World";
cmdBtn01.Tag = cmdBtn01Name;
cmdBtn01.DescriptionText = "Hello World";
cmdBtn01.TooltipText = "Hello World";
cmdBtn01.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler( HelloWorld );
}
private void ThisAddIn_Shutdown( object sender, System.EventArgs e ) {
}
private void HelloWorld( Microsoft.Office.Core.CommandBarButton barButton, ref bool someBool ) {
System.Windows.Forms.MessageBox.Show( "Hello, World!" );
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
尝试将CommandBars
添加为私有成员变量。也许CommandBars
正在收集垃圾。看看这是否解决了您的 RCW 问题 - 如果不是,它可能是另一个插件。
如果这不起作用,也许尝试将Application
设为本地成员。抱歉 - 我没有 MS 项目来测试这个。
private CommandBars cmdBars; // app command bars
private void ThisAddIn_Startup( object sender, System.EventArgs e ) {
//..
cmdBars = this.Application.CommandBars;
cmdBar = cmdBars.Add(cmdBarName, Office.MsoBarPosition.msoBarTop, false, true );
//..
}
试试这个:
cmdBar = this.Application.ActiveExplorer().CommandBars.Add(
而不是:
cmdBar = this.Application.CommandBars.Add(