1

我通过 IronPython 中的 .NET 互操作程序集使用第三方 COM 组件,如下所示:如何在 IronPython 中使用 VB6 COM 'reference'?

我在这方面的经验非常棒,无缝运行的东西给我留下了深刻的印象......除了一件事。

第 3 方 COM 组件使用 Microsoft 的 DAO 库(不确定是什么版本)来处理由另一个第 3 方应用程序创建的数据库。问题是在我的程序运行时重新创建了这个数据库文件,我想“取消初始化”这个 COM 对象。特别是,在我第一次运行我的例程时,运行我的代码(访问 COM 组件的属性、调用它的方法等)运行良好。但是,下一次第三方 COM 组件会显示一个消息框,说明数据库(MSAccess 95 .mdb 文件)已在使用中,并提供重试选项。按重试可以可靠地工作,因此主要问题是出现此对话框。

所以,我的理论是 COM 组件正在向数据库泄漏句柄,我找不到要调用的“清理”方法。我试过.Dispose()了,但没有奏效。

我最后的手段是使调用 COM 对象的代码成为一个单独的 IronPython 进程,该进程通过 std in/out 与我的主进程交互,因为 COM 对象所服务的角色更像是“立即给我所有这些信息”用例而不是持续需要的依赖。

我希望避免这种情况,因为我不熟悉 COM(或者真的,.NET)我只能希望我错过了一个明显的.Dispose方法或类似的东西。

如果没有干净的方法,我可以从我的进程中强制卸载程序集,类似于FreeLibrary本机代码中的重复调用吗?(我保证我的代码将不再使用该对象,所以我不必担心我的部分缺少引用导致内存保护错误)


编辑:

我无法解决这个问题,所以我采用了进程外方法,并在我的子批处理关闭时让 Windows 清理。

4

1 回答 1

1

不确定 IronPython,但在 C# 中使用 COM 时,您需要在使用后调用 Marshal.ReleaseComObject 以确保正确减少引用计数。

否则你会泄漏...... Dispose() 不会为你做这件事。

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

于 2009-08-30T22:49:06.140 回答