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-объект.
Возвращаемое значение
Новое значение счетчика ссылок оболочки 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-компонентов. Таким образом, отдельные и независимые части управляемого кода в домене приложения могут использовать один и тот же RCW для одноэлементного com-компонента, и если один из них вызывает ReleaseComObject метод в компоненте COM, другой будет нарушен.
Поэтому используйте только в ReleaseComObject том случае, если это абсолютно необходимо. Если вы хотите вызвать этот метод, чтобы убедиться, что компонент COM освобождается в определенное время, рекомендуется использовать FinalReleaseComObject метод . FinalReleaseComObject выпустит базовый com-компонент независимо от того, сколько раз он повторно входил в среду CLR. Число внутренних ссылок RCW увеличивается на единицу каждый раз, когда com-компонент повторно входит в среду CLR. Поэтому метод можно вызывать ReleaseComObject в цикле, пока возвращаемое значение не равно нулю. Это позволяет получить тот же результат, что и FinalReleaseComObject метод .