2

我编写了一个使用 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;

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

@Oscars 的回答是正确的:

 Marshal.FinalReleaseComObject(_ap);

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

4

1 回答 1

0

有什么例外吗?您是否正确处理 COM 对象:

Marshal.ReleaseComObject(sheet);

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

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

于 2013-07-16T21:23:02.727 回答