注释
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
gcManagedToUnmanaged每当线程从托管代码转换到非托管代码时,托管调试助手(MDA)都会引发垃圾回收。
症状
尝试使用已向 COM 公开的托管对象时,非托管用户组件会引发访问冲突。 COM 对象似乎已发布。 访问冲突是不确定的。
原因
如果非托管组件未正确对托管 COM 对象进行引用计数,则当非托管组件仍保留对对象的引用时,运行时可能会收集向 COM 公开的托管对象。 垃圾回收期间的运行时调用 Release ,因此,如果用户组件在垃圾回收发生前使用该对象,则尚未收集该对象。 这是不确定性的根源。
解决方案
启用此助手可以减少对象符合收集条件并 Release 被调用之间的时间,帮助跟踪哪些非托管组件首先尝试访问收集的对象。
对运行时的影响
每当线程从托管代码转换到非托管代码时,都会引发垃圾回收。
输出
此 MDA 不生成任何输出。
配置
<mdaConfig>
<assistants>
<gcManagedToUnmanaged/>
</assistants>
</mdaConfig>