我编写了一个使用Visio互操作的C#应用程序。我正在遇到一个让我感到困惑的事件相关问题。 重现的步骤:
当我的应用程序打开时,它会使用以下命令检索打开的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事件中)并且它运行良好。谢谢你的帮助!
答案 0 :(得分:0)
有任何例外吗?您是否正确处理COM对象:
Marshal.ReleaseComObject(sheet);
How do I properly clean up Excel interop objects?
http://msdn.microsoft.com/es-es/library/system.runtime.interopservices.marshal.releasecomobject.aspx