Marshal.ReleaseComObject(Object) Метод

Определение

Уменьшает количество ссылок вызываемого оболочки среды выполнения (RCW), связанного с указанным 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 для выпуска.

Возвращаемое значение

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

Атрибуты

Исключения

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

o равно null.

Комментарии

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

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

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

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

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

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

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

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

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

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