我正在开发一个在前端使用 Excel 并通过 COM 上的第 3 方 API 访问远程数据的应用程序。该应用程序直接在 Excel VBA 中编码(即 Excel 没有 COM 自动化。)有时,在运行我的应用程序后,用户退出时 Excel 不会退出,从而创建了一个消耗约 50% CPU 的僵尸 Excel。
我已经在 SO 上阅读了现有的“Excel 不会退出”答案——它们似乎都与 Excel 的 Interop / COM 自动化有关。在这种情况下如何确保 Excel 退出有什么建议吗?
我正在开发一个在前端使用 Excel 并通过 COM 上的第 3 方 API 访问远程数据的应用程序。该应用程序直接在 Excel VBA 中编码(即 Excel 没有 COM 自动化。)有时,在运行我的应用程序后,用户退出时 Excel 不会退出,从而创建了一个消耗约 50% CPU 的僵尸 Excel。
我已经在 SO 上阅读了现有的“Excel 不会退出”答案——它们似乎都与 Excel 的 Interop / COM 自动化有关。在这种情况下如何确保 Excel 退出有什么建议吗?
我开始相信我的代码创建的 COM 对象没有被正确处理,从而阻止 Excel 完全退出。我试图强制他们发布,导致了这个问题:如何从 Excel 2007 VBA 模块中调用 System.Runtime.InteropServices.Marshal.ReleaseComObject - 引用一个答案(还包括值得一试的相关链接):
当您希望 Excel 退出时,您确定要删除对 COM 对象的所有引用吗?确保为您持有的 COM 对象的每个引用放置如下行:
obj = Nothing ' Where "obj" is a reference to the COM object
如果这不能解决它,那么问题也可能是循环引用。COM 对象是否存储了对您的 VBA 对象的引用,而 VBA 对象又持有对 COM 对象的引用?如果是这样,将创建循环引用并且永远不会释放对象。
我现在怀疑循环引用。Nothing
如果在工作簿关闭事件中将对象本身设置为之前将某些 COM 对象属性设置为,问题就消失了Nothing
,我会回来并将其标记为已接受的答案。
更新
仔细设置对象引用Nothing
并不能解决问题。我最终为 System.Runtime.InteropServices.Marshal.FinalReleaseComObject
. 在 Workbook BeforeClose 事件中对 COM 对象调用 dispose 似乎已经解决了该问题。