如何通过IronPython的互操作程序集处理我正在使用的VB6 COM对象?

时间:2009-08-30 22:30:34

标签: interop ironpython com-interop dispose

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

我在这方面的经验非常好,我对无缝工作的东西印象非常深刻......除了一件事。

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

所以,我的理论是COM组件正在泄漏db的句柄,我找不到一个'cleanup'方法来调用。我已经尝试了.Dispose(),但这没效果。

我的最后一招是将调用COM对象的代码作为一个单独的IronPython进程,通过std in / out与我的主进程交互,因为COM对象所服务的角色更像是'现在给我所有这些信息'用例而不是持续需要的依赖。

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

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


编辑:

我无法解决这个问题,所以当我的子批处理关闭时,我会使用流程方法并让windows清理。

1 个答案:

答案 0 :(得分:1)

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

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

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