1

ここで見られるように、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クリーンな方法がない場合、ネイティブ コードで繰り返し呼び出しを行うのと同じように、プロセスからアセンブリを強制的にアンロードできますか? (コードがオブジェクトをもう使用しないことを保証するので、メモリ保護エラーにつながる参照の欠落を心配する必要はありません)


編集:

これを解決できなかったので、プロセス外の方法を使用し、子のバッチ プロセスがシャットダウンしたときにウィンドウをクリーンアップさせました。

4

1 に答える 1

1

IronPython については不明ですが、C# で COM を使用する場合は、使用後に Marshal.ReleaseComObject を呼び出して、参照カウントが適切にデクリメントされるようにする必要があります。

そうしないとリークします... Dispose() はこれを行いません。

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

于 2009-08-30T22:49:06.140 に答える