ここで見られるように、IronPython で .NET 相互運用機能アセンブリを使用してサード パーティの COM コンポーネントを使用しています: How can I use a VB6 COM 'reference' in IronPython?
この分野での私の経験は素晴らしいものでした.シームレスに機能するものの量に非常に感銘を受けました.1つのことを除いて.
サード パーティの COM コンポーネントは、Microsoft の DAO ライブラリ (バージョンは不明) を使用して、さらに別のサード パーティ アプリケーションによって作成されたデータベースを操作します。問題は、このデータベース ファイルがプログラムの実行中に再作成されることです。この COM オブジェクトを「初期化解除」したいと考えています。特に、自分のコード (COM コンポーネントの属性にアクセスしたり、そのメソッドを呼び出したりするコード) を実行すると、最初にルーチンを実行したときに問題なく動作します。ただし、次回、サード パーティの COM コンポーネントは、データベース (MSAccess 95 .mdb ファイル) が既に使用されていることを示すメッセージ ボックスを表示し、再試行するオプションを提供します。再試行を押すと確実に機能するため、主な問題はこのダイアログが表示されることです。
したがって、私の理論では、COM コンポーネントがデータベースへのハンドルをリークしており、呼び出す「クリーンアップ」メソッドが見つかりません。試してみましたが、うまくいきませ.Dispose()
んでした。
私の最後の手段は、COM オブジェクトを呼び出すコードを、std in/out を介してメイン プロセスと対話する別の IronPython プロセスにすることです。これは、COM オブジェクトが提供する役割が「このすべての情報を今すぐ提供する」ユース ケースに近いためです。継続的に必要な依存関係の代わりに。
私はそのシナリオを避けたいと思っています.COM(または実際には.NET)に慣れていないので、明らかな.Dispose
方法などが欠けていることを願っています。
FreeLibrary
クリーンな方法がない場合、ネイティブ コードで繰り返し呼び出しを行うのと同じように、プロセスからアセンブリを強制的にアンロードできますか? (コードがオブジェクトをもう使用しないことを保証するので、メモリ保護エラーにつながる参照の欠落を心配する必要はありません)
編集:
これを解決できなかったので、プロセス外の方法を使用し、子のバッチ プロセスがシャットダウンしたときにウィンドウをクリーンアップさせました。