Marshal.ReleaseComObject(Object) メソッド


指定した COM オブジェクトに関連付けられている指定したランタイム呼び出し可能ラッパー (RCW) の参照カウントをデクリメントします。Decrements the reference count of the Runtime Callable Wrapper (RCW) associated with the specified COM object.

 static int ReleaseComObject(System::Object ^ o);
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer



解放する COM オブジェクト。The COM object to release.



o に関連付けられている RCW の参照カウントの新しい値。The new value of the reference count of the RCW associated with o. この値は通常 0 です。RCW は、ラップされた COM オブジェクトへの参照を、それを呼び出しているマネージド クライアントの数に関係なく、1 つしか保持しないためです。This value is typically zero since the RCW keeps just one reference to the wrapped COM object regardless of the number of managed clients calling it.



o は有効な COM オブジェクトではありません。o is not a valid COM object.

onullです。o is null.


このメソッドは、マネージコードから使用される COM オブジェクトの有効期間を明示的に制御するために使用されます。This method is used to explicitly control the lifetime of a COM object used from managed code. このメソッドを使用して、リソースへの参照を保持する基になる COM オブジェクトを適時に解放するか、オブジェクトを特定の順序で解放する必要があるかを確認する必要があります。You should use this method to free the underlying COM object that holds references to resources in a timely manner or when objects must be freed in a specific order.

COM インターフェイスポインターは、共通言語ランタイム (CLR) に入るたびに、RCW にラップされます。Every time a COM interface pointer enters the common language runtime (CLR), it is wrapped in an RCW.

RCW には、COM インターフェイスポインターがマップされるたびにインクリメントされる参照カウントがあります。The RCW has a reference count that is incremented every time a COM interface pointer is mapped to it. メソッドは、 ReleaseComObject RCW の参照カウントをデクリメントします。The ReleaseComObject method decrements the reference count of an RCW. 参照カウントがゼロになると、ランタイムはアンマネージ COM オブジェクトに対するすべての参照を解放し、オブジェクトをさらに使用しようとすると、をスローし System.NullReferenceException ます。When the reference count reaches zero, the runtime releases all its references on the unmanaged COM object, and throws a System.NullReferenceException if you attempt to use the object further. 同じ COM インターフェイスがアンマネージコードからマネージコードに複数回渡された場合、ラッパーの参照カウントは毎回インクリメントされ、を呼び出すと ReleaseComObject 残りの参照の数が返されます。If the same COM interface is passed more than one time from unmanaged to managed code, the reference count on the wrapper is incremented every time, and calling ReleaseComObject returns the number of remaining references.

このメソッドを使用すると、必要なときに正確に発生するように RCW 参照カウントの解放を強制的に実行できます。This method enables you to force an RCW reference count release so that it occurs precisely when you want it to. ただし、を不適切に使用すると、 ReleaseComObject アプリケーションが失敗するか、アクセス違反が発生する可能性があります。However, improper use of ReleaseComObject may cause your application to fail, or may cause an access violation.

アプリケーションドメイン内のマネージコードが COM コンポーネントを表す RCW 上に保持しているシナリオについて考えてみます。Consider a scenario in which managed code in an application domain is holding onto an RCW that represents a COM component. ReleaseComObjectRcw でメソッドを呼び出すと、マネージコードは rcw にアクセスできなくなり、例外が発生し InvalidComObjectException ます。If you call the ReleaseComObject method on the RCW, the managed code will be unable to access the RCW and will raise an InvalidComObjectException exception.

Rcw が解放されたときに RCW の呼び出しが実行されると、より深刻なエラーが発生する可能性があります。A more serious error may occur if a call to the RCW is executing when the RCW is released. この場合、呼び出しを行うスレッドによってアクセス違反が発生する可能性が高くなります。In this case, there is a good chance that the thread making the call will cause an access violation. ただし、プロセスメモリが破損する可能性があり、デバッグが非常に困難な理由によりプロセスが失敗するまで継続して実行される可能性があります。However, process memory may become corrupted, and the process may continue to run until it fails for reasons that are very difficult to debug.

このリスクは、使用されている COM コンポーネントがシングルトンの場合、次の理由により、CLR は com CoCreateInstance 関数を呼び出して com コンポーネントをアクティブにします。 com CoCreateInstance 関数は、シングルトン com コンポーネントに対して呼び出されるたびに同じインターフェイスポインターを返します。This risk is compounded when the COM component that is being used is a singleton, for the following reason: The CLR activates COM components by calling the COM CoCreateInstance function, which returns the same interface pointer every time it is called for singleton COM components. このため、アプリケーションドメイン内のマネージコードの独立した部分は、シングルトン COM コンポーネントに対して同じ RCW を使用することができます。また、どちらか一方が COM コンポーネントでメソッドを呼び出すと、 ReleaseComObject もう一方は中断されます。Thus, separate and independent pieces of managed code in an application domain can be using the same RCW for a singleton COM component, and if either one calls the ReleaseComObject method on the COM component, the other will be broken.

したがって、が絶対に必要な場合にのみ、を使用して ReleaseComObject ください。Therefore, use the ReleaseComObject only if it is absolutely required. このメソッドを呼び出して、特定の時刻に COM コンポーネントが解放されるようにするには、代わりにメソッドを使用することを検討してください FinalReleaseComObjectIf you want to call this method to ensure that a COM component is released at a determined time, consider using the FinalReleaseComObject method instead. FinalReleaseComObject は、CLR に再入力された回数に関係なく、基になる COM コンポーネントを解放します。FinalReleaseComObject will release the underlying COM component regardless of how many times it has re-entered the CLR. RCW の内部参照カウントは、COM コンポーネントが CLR に再入力するたびに1ずつインクリメントされます。The internal reference count of the RCW is incremented by one every time the COM component re-enters the CLR. したがって、 ReleaseComObject 返される値が0になるまで、ループでメソッドを呼び出すことができます。Therefore, you could call the ReleaseComObject method in a loop until the value returned is zero. これにより、メソッドと同じ結果が得られ FinalReleaseComObject ます。This achieves the same result as the FinalReleaseComObject method.