C#Visio Interop,未调用事件处理程序
本文关键字:事件处理 程序 调用 Interop C#Visio | 更新日期: 2023-09-27 18:22:34
我已经编写了一个使用Visio互操作的C#应用程序。我正在经历一个令我困惑的事件相关问题。复制步骤:
- 启动Visio
- 启动我的应用程序。检索Visio实例,可以使用对象模型,并且在我的应用程序中接收和处理事件
- 关闭我的应用程序-使Visio保持打开状态
- 启动我的应用程序。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事件中)调用了这段代码,它运行得很好。谢谢你的帮助!
是否有异常?您是否正确地使用处理COM对象
Marshal.ReleaseComObject(sheet);
如何正确清理Excel互操作对象?
http://msdn.microsoft.com/es-es/library/system.runtime.interopservices.marshal.releasecomobject.aspx