Marshal.ReleaseComObject(Object) Marshal.ReleaseComObject(Object) Marshal.ReleaseComObject(Object) Marshal.ReleaseComObject(Object) Method

Определение

Уменьшает счетчик ссылок вызываемой оболочки времени выполнения (RCW), связанной с указанным COM-объектом. Decrements the reference count of the Runtime Callable Wrapper (RCW) associated with the specified COM object.

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

Параметры

o
Object Object Object Object

Освобождаемый COM-объект. The COM object to release.

Возвраты

Новое значение счетчика ссылок оболочки RCW, связанной с o. The new value of the reference count of the RCW associated with o. Это значение обычно равно нулю, поскольку оболочка RCW хранит только одну ссылку на COM-объект в оболочке вне зависимости от количества управляемых клиентов, которые ее вызывают. 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.

Свойство o имеет значение null. 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.

Вызываемая оболочка времени Выполнения имеет значение счетчика ссылок, который увеличивается каждый раз, он сопоставляется указатель интерфейса СОМ.The RCW has a reference count that is incremented every time a COM interface pointer is mapped to it. ReleaseComObject Метод уменьшает значение счетчика ссылок для вызываемой оболочки времени Выполнения.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.

Этот метод позволяет принудительно выпустить счетчик ссылок вызываемой оболочки времени Выполнения, что происходит точно при необходимости его.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.

Рассмотрим сценарий, в котором управляемый код в домене приложения полагается на RCW, которая представляет COM-компонент.Consider a scenario in which managed code in an application domain is holding onto an RCW that represents a COM component. При вызове метода ReleaseComObject метод на 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, при отпускании вызываемая оболочка времени Выполнения.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-компонентов, вызвав 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 и если один из вызовов одного ReleaseComObject метод COM-компонента, то будет нарушена.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-компонента в определенное время, рассмотрите возможность использования FinalReleaseComObject метод вместо этого.If 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 выпустит в базовый компонент COM, независимо от того, сколько раз он повторно вошел в среде CLR.FinalReleaseComObject will release the underlying COM component regardless of how many times it has re-entered the CLR. Число внутренних ссылок оболочки RCW увеличивается на единицу каждый раз, чтобы COM-компонент повторно входит в среду CLR.The internal reference count of the RCW is incremented by one every time the COM component re-enters the CLR. Таким образом, можно вызвать ReleaseComObject метод в цикле, пока возвращаемое значение равно нулю.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.

Безопасность

SecurityCriticalAttribute
Требует полного доверия для непосредственного вызывающего объекта. requires full trust for the immediate caller. Этот член не может использоваться частично доверенным или прозрачным кодом. This member cannot be used by partially trusted or transparent code.

Применяется к

См. также