0

特定の条件が失敗した場合、またはオブジェクトが部分的に構築された場合に、C# .NET から強制的に COM サーバー オブジェクトの割り当てを解除する方法を教えてください。

問題は、DCOM メカニズムを使用してその COM サーバーを使用していることです。最悪の場合、オブジェクトが完全に作成されておらず、障害が発生してからアプリケーションを終了しようとしても、COM オブジェクトはまだメモリ内にあります (COM+ アプリケーション コンポーネント サービスに示されています)。制限を超えると、メモリ リークやクラッシュが発生します。ただし、管理可能な量の障害が発生した場合、ある時点で削除されます。

サンプル:- Calculator.App objApp = new Calculator.App();

if( !obj.CanBeUsed() ) { //COM オブジェクト objApp の割り当てを解除する方法 }

注: Garbase Collector がヒープ メモリから強制的に割り当てを解除するために使用するメソッド GC.Collect() があります。この方法を使用できるか、.NET franework がこの特定のケースに対して別の解決策を提供しているかどうか?

4

2 に答える 2

2

このような:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);
于 2010-10-21T11:37:46.873 に答える
1

Marshal.FinalReleaseComObjectメソッドを試す必要があります。

FinalReleaseComObject メソッドは、COM オブジェクトへのマネージ参照を解放します。このメソッドを呼び出すことは、0 (ゼロ) が返されるまでループ内で ReleaseComObject メソッドを呼び出すことと同じです。

COM オブジェクトの参照カウントが 0 になると、COM オブジェクトは通常解放されますが、これは COM オブジェクトの実装に依存し、ランタイムの制御を超えています。ただし、RCW は引き続き存在し、ガベージ コレクションを待機します。

COM オブジェクトは、基になる RCW から分離された後は使用できません。参照カウントが 0 になった後で RCW のメソッドを呼び出そうとすると、InvalidComObjectException がスローされます。

于 2010-10-21T11:38:37.940 に答える