私は、IronPythonので.NET interopアセンブリによって、サードパーティのCOMコンポーネントを使用しています:How can I use a VB6 COM 'reference' in IronPython?IronPythonのinteropアセンブリを介して使用しているVB6 COMオブジェクトを処分するにはどうすればよいですか?ここに見られるように
この分野での私の経験は素晴らしいされている、私はものの量によって、非常に感銘を受けたそれはシームレスに動作します...一つのことを除いて。
サードパーティのCOMコンポーネントは、MicrosoftのDAOライブラリ(どのバージョンがわからないのか)を使用して、さらに別のサードパーティ製アプリケーションで作成されたデータベースで動作します。問題は、このデータベースファイルがプログラムの実行時に再作成され、このCOMオブジェクトを「初期化しない」ことです。特に、自分のコードを実行すると(COMコンポーネントの属性にアクセスし、メソッドを呼び出すなど)、初めてルーチンを実行するときにうまく動作します。ただし、次回は、サードパーティのCOMコンポーネントは、データベース(MSAccess 95 .mdbファイル)が既に使用中であることを示すメッセージボックスを表示し、再試行するオプションを提供します。再試行を押すと確実に動作するので、主な問題はこのダイアログが表示されることです。
私の理論では、COMコンポーネントがハンドルをデータベースに漏らしているため、呼び出すための 'クリーンアップ'メソッドが見つかりません。私は.Dispose()
を試しましたが、それはうまくいきませんでした。
私の最後の手段は、COMオブジェクトを呼び出すコードを、std in/outを介してメインプロセスとやり取りする別々のIronPythonプロセスとし、COMオブジェクトが役割を果たすようにしています。継続的に必要とされる依存関係ではなく、現在のユースケースを使用します。
私はこのようなシナリオを避けたいと思っています。私はCOMに精通していないので、私は明白な.Dispose
メソッドなどがないことを願っています。
クリーンな方法がない場合、ネイティブコードでFreeLibrary
呼び出しを繰り返すのと同じように、アセンブリから強制的にアセンブリをアンロードできますか?
I:
EDIT(私は私のコードはもうオブジェクトを使用しないので、私はメモリ保護エラーにつながる私の部分に参考文献行方不明を心配する必要はありませんことを保証します)これを解決することができませんでしたので、私はout of processメソッドを実行し、子バッチプロセスがシャットダウンするとウィンドウをクリーンアップさせました。
私はReleaseComObjectを読んでいますが、これについてもっと知りました。残念ながら、私のサードパーティのCOMコンポーネントは正しく動作していません。私は参照のために私のコードをチェックし、それらはすべてクリーンアップされています。特に、ここでは、ComWrapクラスを使用してhttp://dump.cbwhiz.com/comwrap.pyを参照して、リファレンスを自動リリースします。 –