Marshal.ReleaseComObject(Object) Метод

Определение

Уменьшает счетчик ссылок вызываемой оболочки времени выполнения, связанной с указанным COM-объектом.

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

Новое значение счетчика ссылок оболочки RCW, связанной с o. Это значение обычно равно нулю, поскольку оболочка RCW хранит только одну ссылку на COM-объект в оболочке вне зависимости от количества управляемых клиентов, которые ее вызывают.

Атрибуты

Исключения

o не является допустимым COM-объектом.

o имеет значение null.

Комментарии

Этот метод используется для явного управления временем существования COM-объекта, используемого из управляемого кода. Этот метод следует использовать для освобождения базового COM-объекта, который содержит ссылки на ресурсы своевременно или когда объекты должны быть освобождены в определенном порядке.

Каждый раз, когда указатель com-интерфейса входит в среду CLR, она упаковывается в RCW.

RcW имеет количество ссылок, которое увеличивается при каждом сопоставлении указателя интерфейса COM. Метод ReleaseComObject уменьшает количество ссылок rcW. Когда число ссылок достигает нуля, среда выполнения освобождает все его ссылки на неуправляемый COM-объект и создает исключение System.NullReferenceException при попытке дальнейшего использования объекта. Если один и тот же COM-интерфейс передается несколько раз из неуправляемого в управляемый код, количество ссылок на оболочку увеличивается каждый раз, а вызов ReleaseComObject возвращает количество оставшихся ссылок.

Этот метод позволяет принудительно применить выпуск счетчика ссылок RCW, чтобы оно произошло именно тогда, когда требуется. Однако неправильное ReleaseComObject использование может привести к сбою приложения или может привести к нарушению доступа.

Рассмотрим сценарий, в котором управляемый код в домене приложения удерживается на rcW, представляющего COM-компонент. При вызове ReleaseComObject метода в RCW управляемый код не сможет получить доступ к RCW и вызовет InvalidComObjectException исключение.

Более серьезная ошибка может возникнуть, если вызов RCW выполняется при освобождении RCW. В этом случае есть хорошая вероятность того, что поток, выполняющий вызов, приведет к нарушению доступа. Однако память процесса может стать поврежденной, и процесс может продолжать выполняться до тех пор, пока не будет выполнен сбой по причинам, которые очень трудно выполнить отладку.

Этот риск усугубляется, когда используемый com-компонент является одним из следующих причин: среда CLR активирует com-компоненты, вызывая функцию COM CoCreateInstance , которая возвращает один и тот же указатель интерфейса при каждом вызове для компонентов COM с одним и тем же кодом COM. Таким образом, отдельные и независимые части управляемого кода в домене приложения могут использовать один и тот же RCW для одноэлементного COM-компонента, а если один вызывает ReleaseComObject метод в com-компоненте, другой будет нарушен.

Поэтому используйте ReleaseComObject только в том случае, если это абсолютно необходимо. Если вы хотите вызвать этот метод, чтобы убедиться, что com-компонент освобождается в определенное время, рассмотрите возможность использования FinalReleaseComObject метода. FinalReleaseComObject выпустит базовый COM-компонент независимо от того, сколько раз он повторно ввел среду CLR. Количество внутренних ссылок rcW увеличивается по одному при повторном входе com-компонента в среду CLR. Таким образом, можно вызвать ReleaseComObject метод в цикле, пока возвращаемое значение не будет равно нулю. Это достигает того же результата, что FinalReleaseComObject и метод.

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

См. также раздел