【问题标题】:VSTO MS Project 2007 Add-In Button Events Stop firing after a few minutesVSTO MS Project 2007 加载项按钮事件 几分钟后停止触发
【发布时间】:2012-05-02 02:51:44
【问题描述】:

我正在编写一个 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
    }
}

【问题讨论】:

    标签: visual-studio-2010 vsto ms-project


    【解决方案1】:

    尝试将CommandBars 添加为私有成员变量。也许CommandBars 正在收集垃圾。看看这是否解决了您的 RCW 问题 - 如果没有,它可能是另一个插件。

    如果这不起作用,也许尝试让Application 成为本地成员。抱歉 - 我没有 MS Project 来测试它。

    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 );
      //..
    }
    

    【讨论】:

    • 非常感谢您的建议。现在一切都很好。以防万一其他人读到这篇文章,我不需要本地化对 Application 类的引用。将字段设为私有就可以了。
    【解决方案2】:

    试试这个:

    cmdBar = this.Application.ActiveExplorer().CommandBars.Add(
    

    代替:

    cmdBar = this.Application.CommandBars.Add(
    

    【讨论】:

    • ActiveExplorer 是 Outlook 对象,而不是 MS Project 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多