Share via


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 オブジェクト。

戻り値

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

属性

例外

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

onullです。

注釈

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

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

RCW には、COM インターフェイス ポインターがマップされるたびにインクリメントされる参照カウントがあります。 メソッドは ReleaseComObject 、RCW の参照カウントをデクリメントします。 参照カウントが 0 に達すると、ランタイムはアンマネージ COM オブジェクトのすべての参照を解放し、オブジェクトをさらに使用しようとすると をスロー 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 コンポーネントを解放します。 COM コンポーネントが CLR に再入力するたびに、RCW の内部参照カウントが 1 ずつインクリメントされます。 したがって、返される値が ReleaseComObject 0 になるまで、ループ内で メソッドを呼び出すこともできます。 これにより、 メソッドと同じ結果が FinalReleaseComObject 得られます。

適用対象

こちらもご覧ください