gcManagedToUnmanaged MDA
注意
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
每当线程从托管代码转换到非托管代码时,gcManagedToUnmanaged
托管调试助手 (MDA) 都会引起垃圾回收。
症状
当尝试使用已向 COM 公开的托管的对象时,非托管的用户组件会引发访问冲突。 COM 对象显示为已发布。 访问冲突具有不确定性。
原因
如果非托管组件未对托管的 COM 对象执行正确的引用计数,则当非托管组件仍拥有对象的引用时,运行时可能收集已向 COM 公开的托管对象。 运行时在垃圾回收期间调用 Release,因此如果用户组件在垃圾回收发生前使用对象,则不回收此对象。 这就造成了不确定性。
解决方法
启用此助手可缩短对象符合回收条件时和调用 Release 时的时间间隔,从而有助于跟踪首先尝试访问回收对象的非托管组件。
对运行时的影响
每当线程从托管代码转换到非托管代码时,都会引起垃圾回收。
输出
此 MDA 不会产生任何输出。
Configuration
<mdaConfig>
<assistants>
<gcManagedToUnmanaged/>
</assistants>
</mdaConfig>