gcManagedToUnmanaged MDA

每当一个线程从托管代码转换到非托管代码,gcManagedToUnmanaged 托管调试助手 (MDA) 就会导致垃圾回收。

症状

非托管用户组件在尝试使用已公开到 COM 的托管对象时会引发一个访问冲突。 该 COM 对象似乎已经被释放。 该访问冲突是不确定的。

原因

如果一个非托管组件没有正确地对托管 COM 对象进行引用计数,则在该非托管组件仍然保持着对该对象的引用时,运行时会回收向 COM 公开的托管对象。 运行时在垃圾回收期间调用 Release,所以,如果用户组件在垃圾回收发生之前使用该对象,则该对象尚未被回收。 这就是上面的不确定情况的根源。

解决方法

启用此助手可以减少从该对象符合回收条件到调用 Release 之间的时间,这有助于跟踪哪个非托管组件首先尝试访问回收的对象。

对运行时的影响

导致每当发生从托管代码到非托管代码的线程转换时都进行垃圾回收。

Output

此 MDA 不生成任何输出。

配置

<mdaConfig>
  <assistants>
    <gcManagedToUnmanaged/>
  </assistants>
</mdaConfig>

请参见

参考

MarshalAsAttribute

gcUnmanagedToManaged MDA

概念

使用托管调试助手诊断错误

互操作封送处理

其他资源

互操作性