Share via


Marshal.ReleaseComObject(Object) 方法

定义

递减与指定的 COM 对象关联的运行时可调用包装器 (RCW) 的引用计数。

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 对象。

返回

o 关联的 RCW 的新引用计数值。 此值通常为零,因为无论调用包装 COM 对象的托管客户端有多少,RCW 仅保留对该对象的一次引用。

属性

例外

o 不是有效的 COM 对象。

onull

注解

此方法用于显式控制托管代码中使用的 COM 对象的生存期。 应使用此方法释放保存对资源的引用的基础 COM 对象,或者必须按特定顺序释放对象。

每次 COM 接口指针进入公共语言运行时 (CLR) 时,它都会包装在 RCW 中。

RCW 的引用计数在每次 COM 接口指针映射到它时都会递增。 方法 ReleaseComObject 递减 RCW 的引用计数。 当引用计数达到零时,运行时会释放对非托管 COM 对象的所有引用,如果尝试进一 System.NullReferenceException 步使用该对象,则会引发 。 如果将同一 COM 接口从非托管代码多次传递到托管代码,则包装上的引用计数每次都会递增,调用 ReleaseComObject 将返回剩余引用数。

使用此方法可以强制发布 RCW 引用计数,以便它准确出现在所需时间。 但是,不当使用 ReleaseComObject 可能会导致应用程序失败,或者可能导致访问冲突。

假设应用程序域中的托管代码持有表示 COM 组件的 RCW。 如果在 RCW 上调用 ReleaseComObject 方法,则托管代码将无法访问 RCW,并引发 InvalidComObjectException 异常。

如果在释放 RCW 时执行对 RCW 的调用,则可能会发生更严重的错误。 在这种情况下,进行调用的线程很有可能会导致访问冲突。 但是,进程内存可能会损坏,并且进程可能会继续运行,直到由于非常难以调试的原因而失败。

当使用的 COM 组件是单一实例时,这种风险会加剧,原因如下:CLR 通过调用 COM CoCreateInstance 函数来激活 COM 组件,该函数每次为单一实例 COM 组件调用它时,都会返回相同的接口指针。 因此,应用程序域中独立且独立的托管代码片段可以对单一实例 COM 组件使用相同的 RCW,如果其中一个组件调用 ReleaseComObject COM 组件上的 方法,则另一个将损坏。

因此,仅在绝对需要时才使用 ReleaseComObject 。 如果要调用此方法以确保 COM 组件在确定的时间释放,请考虑改用 FinalReleaseComObject 方法。 FinalReleaseComObject 无论重新输入 CLR 的次数如何,都将释放基础 COM 组件。 每次 COM 组件重新进入 CLR 时,RCW 的内部引用计数都会递增 1。 因此,可以在循环中调用 方法, ReleaseComObject 直到返回的值为零。 这可实现与 方法相同的结果 FinalReleaseComObject

适用于

另请参阅