Marshal.ReleaseComObject(Object) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
递减与指定 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 的引用计数的新值。 此值通常为零,因为 RCW 仅保留对包装 COM 对象的一个引用,而不考虑调用它的托管客户端数。
- 属性
例外
o 不是有效的 COM 对象。
o 是 null。
注解
此方法用于显式控制托管代码中使用的 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 的内部引用计数都会递增一个。 因此,可以在循环中调用 ReleaseComObject 该方法,直到返回的值为零。 这可实现与方法相同的结果 FinalReleaseComObject 。