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 и метод.