Marshal.ReleaseComObject(Object) メソッド

定義

指定した COM オブジェクトに関連付けられている指定したランタイム呼び出し可能ラッパー (RCW) の参照カウントをデクリメントします。

public:
 static int ReleaseComObject(System::Object ^ o);
[System.Security.SecurityCritical]
public static int ReleaseComObject (object o);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
[<System.Security.SecurityCritical>]
static member ReleaseComObject : obj -> int
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer

パラメーター

o
Object

解放する COM オブジェクト。

戻り値

Int32

o に関連付けられている RCW の参照カウントの新しい値。 この値は通常 0 です。RCW は、ラップされた COM オブジェクトへの参照を、それを呼び出しているマネージド クライアントの数に関係なく、1 つしか保持しないためです。

属性

例外

o は有効な COM オブジェクトではありません。

onullです。

注釈

このメソッドは、マネージド コードから使用される COM オブジェクトの有効期間を明示的に制御するために使用されます。 このメソッドを使用して、リソースへの参照をタイムリーに保持する基になる COM オブジェクトを解放するか、オブジェクトを特定の順序で解放する必要がある場合に解放する必要があります。

COM インターフェイス ポインターが共通言語ランタイム (CLR) に入るたびに、RCW でラップされます。

RCW には、COM インターフェイス ポインターがマップされるたびにインクリメントされる参照カウントがあります。 このメソッドは ReleaseComObject 、RCW の参照カウントをデクリメントします。 参照カウントが 0 に達すると、ランタイムはアンマネージ COM オブジェクトのすべての参照を解放し、オブジェクトをさらに使用しようとすると a System.NullReferenceException をスローします。 同じ COM インターフェイスがアンマネージドコードからマネージド コードに複数回渡された場合、ラッパーの参照カウントは毎回インクリメントされ、呼び出し ReleaseComObject は残りの参照の数を返します。

このメソッドを使用すると、RCW 参照カウントを強制的に解放して、必要なときに正確に実行できます。 ただし、不適切に使用 ReleaseComObject すると、アプリケーションが失敗したり、アクセス違反が発生したりする可能性があります。

アプリケーション ドメイン内のマネージド コードが、COM コンポーネントを表す RCW を保持しているシナリオを考えてみましょう。 RCW でメソッドを ReleaseComObject 呼び出すと、マネージド コードは RCW にアクセスできず、例外が InvalidComObjectException 発生します。

RCW のリリース時に RCW の呼び出しが実行されている場合は、より重大なエラーが発生する可能性があります。 この場合、呼び出しを行うスレッドがアクセス違反を引き起こす可能性が高くなります。 ただし、プロセス メモリが破損し、デバッグが非常に困難な理由でプロセスが失敗するまでプロセスが実行され続ける可能性があります。

このリスクは、使用されている COM コンポーネントがシングルトンである場合に複合化されます。次の理由により、CLR は COM CoCreateInstance 関数を呼び出して COM コンポーネントをアクティブ化します。この関数は、シングルトン COM コンポーネントに対して呼び出されるたびに同じインターフェイス ポインターを返します。 したがって、アプリケーション ドメイン内の個別の独立したマネージド コードは、シングルトン COM コンポーネントに対して同じ RCW を使用でき、どちらか一方が COM コンポーネントでメソッドを ReleaseComObject 呼び出すと、もう一方が破損します。

したがって、絶対に ReleaseComObject 必要な場合にのみ使用してください。 このメソッドを呼び出して、COM コンポーネントが決められた時点で確実に解放されるようにする場合は、代わりにメソッドを FinalReleaseComObject 使用することを検討してください。 FinalReleaseComObject では、CLR に再入力された回数に関係なく、基になる COM コンポーネントが解放されます。 RCW の内部参照カウントは、COM コンポーネントが CLR に再入力するたびに 1 ずつインクリメントされます。 したがって、返される値が ReleaseComObject 0 になるまで、ループ内でメソッドを呼び出します。 これにより、メソッドと同じ結果が FinalReleaseComObject 得られます。

適用対象

こちらもご覧ください