2009-08-30 32 views
1

我使用的是第三方COM组件由IronPython的一个.NET互操作程序集的手段,因为在这里看到:How can I use a VB6 COM 'reference' in IronPython?如何处理通过IronPython的互操作程序集使用的VB6 COM对象?

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

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

所以,我的理论是COM组件泄漏句柄到数据库,我找不到一个'清理'方法来调用。我试过.Dispose(),但那没有奏效。

我最后的手段是使调用COM对象的代码通过标准输入/输出与我的主进程交互的独立IronPython进程,因为COM对象所服务的角色更像是'给我所有这些信息现在'用例而不是连续的必需的依赖。

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

如果没有干净的方法,我可以强制卸载程序中的程序集,类似于在本机代码中重复调用FreeLibrary? (我保证我的代码将不会被使用的对象了,所以我不应该需要担心我的一部分导致内存保护错误遗漏裁判)


编辑:

我无法解决这个问题,所以我退出了处理方法,并让我的子批处理过程关闭时让Windows清理。

回答

1

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

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

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

+0

我对ReleaseComObject的阅读了,我现在更多地了解它。不幸的是,我的第三方COM组件运行不正常。我检查了我的代码以获取任何参考,并将它们全部清理干净。特别是,我现在使用ComWrap类http://dump.cbwhiz.com/comwrap.py来自动发布引用。 – 2009-08-31 10:59:05

相关问题