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

本文关键字:事件处理 程序 调用 Interop C#Visio | 更新日期: 2023-09-27 18:22:34

我已经编写了一个使用Visio互操作的C#应用程序。我正在经历一个令我困惑的事件相关问题。复制步骤:

  1. 启动Visio
  2. 启动我的应用程序。检索Visio实例,可以使用对象模型,并且在我的应用程序中接收和处理事件
  3. 关闭我的应用程序-使Visio保持打开状态
  4. 启动我的应用程序。Visio实例已检索,对象模型可以使用,但我的应用程序未接收到事件

当我的应用程序打开时,它会使用将实例检索到打开的Visio应用程序

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

我注册这样的事件:

visioApp.DocumentOpened += new EApplication_DocumentOpenedEventHandler(onDocOpened);

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

visioApp.DocumentOpened -= onDocOpened;
visioApp = null;

当我的应用程序关闭时,我似乎没有正确地注销/释放实例,但这只是猜测。当我的应用程序第二次启动时,我没有收到任何错误——它只是不响应事件。我在网上找不到任何进一步的相关信息(可能只是没有搜索到正确的术语)。非常感谢您的帮助!我会提供更多有用的信息。

@奥斯卡的答案是正确的:

 Marshal.FinalReleaseComObject(_ap);

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

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

是否有异常?您是否正确地使用处理COM对象

Marshal.ReleaseComObject(sheet);

如何正确清理Excel互操作对象?

http://msdn.microsoft.com/es-es/library/system.runtime.interopservices.marshal.releasecomobject.aspx