2009-08-30 27 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

相關問題