我使用的是第三方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清理。
我對ReleaseComObject的閱讀了,我現在更多地瞭解它。不幸的是,我的第三方COM組件運行不正常。我檢查了我的代碼以獲取任何參考,並將它們全部清理乾淨。特別是,我現在使用ComWrap類http://dump.cbwhiz.com/comwrap.py來自動發佈引用。 – 2009-08-31 10:59:05