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

返回

Int32

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 组件在确定时发布,请考虑改用该方法 FinalReleaseComObjectFinalReleaseComObject 无论其重新输入 CLR 的次数如何,都会释放基础 COM 组件。 每次 COM 组件重新输入 CLR 时,RCW 的内部引用计数都会递增一个。 因此,可以在循环中调用 ReleaseComObject 该方法,直到返回的值为零。 这可实现与方法相同的结果 FinalReleaseComObject

适用于

另请参阅