C#Visio Interop,未调用事件处理程序

时间:2013-07-16 21:16:15

标签: c# visio

我编写了一个使用Visio互操作的C#应用​​程序。我正在遇到一个让我感到困惑的事件相关问题。 重现的步骤:

  1. 启动Visio
  2. 启动我的申请。重新启动Visio实例,可以使用对象模型,并在我的应用程序中接收和处理事件。
  3. 关闭我的应用程序 - 打开Visio。
  4. 启动我的应用。检索Visio实例并可以使用对象模型,但我的应用程序不接收事件。
  5. 当我的应用程序打开时,它会使用以下命令检索打开的Visio App的实例:

    visioApp = (Microsoft.Office.Interop.Visio.Application)Marshal.GetActiveObject("Visio.Application");
    

    我注册了这样的事件:

    visioApp.DocumentOpened += new EApplication_DocumentOpenedEventHandler(onDocOpened);
    

    当我的应用关闭时,我会注销事件,如下所示:

    visioApp.DocumentOpened -= onDocOpened;
    visioApp = null;
    

    在我的应用程序关闭时,似乎我没有正确取消注册/让实例运行,但这只是一个猜测。当我的应用程序第二次启动时,我没有错误 - 它只是没有响应事件。我无法在线找到任何进一步的相关信息(可能只是没有搜索正确的术语)。任何帮助是极大的赞赏!我将提供更多可能有用的信息。

    @Oscars答案是正确的:

     Marshal.FinalReleaseComObject(_ap);
    

    但是我还有一个问题。 Marshal.finalReleaseComObject是在类析构函数中调用的,显然在应用程序关闭序列中调用太晚了(即使我强制进行垃圾回收),并且没有正确释放引用。我现在更早地调用此代码(在MainForm_Closing事件中)并且它运行良好。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)