我编写了一个使用 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;
当我的应用程序关闭时,我似乎没有正确取消注册/让实例离开,但这只是一个猜测。当我的应用程序第二次启动时,我没有收到任何错误 - 它只是不响应事件。我无法在网上找到任何进一步的相关信息(可能只是没有搜索正确的术语)。任何帮助是极大的赞赏!我将提供更多可能有用的信息。
@Oscars 的回答是正确的:
Marshal.FinalReleaseComObject(_ap);
但是我还有一个问题。Marshal.finalReleaseComObject 在类析构函数中被调用,显然在应用程序关闭序列中调用得太晚(即使我强制垃圾收集),并且没有正确释放引用。我现在更早地调用了这段代码(在 MainForm_Closing 事件中),它运行良好。谢谢您的帮助!