disconnectedContext MDA

更新:2007 年 11 月

如果 CLR 在维护关于 COM 对象的请求时试图转换到断开的单元或上下文,则将激活 disconnectedContext 托管调试助手 (MDA)。

症状

将对 运行库可调用包装 (RCW) 发出的调用发送到当前单元或上下文中的基础 COM 组件,而不是发送到调用所在的 COM 组件。如果该 COM 组件不是多线程的(例如单线程单元 (STA) 组件),则将导致损坏或数据丢失。或者,如果 RCW 本身是一个代理,则该调用可能导致 RPC_E_WRONG_THREAD 的 HRESULT 引发 COMException

原因

当 CLR 试图转换到 OLE 单元或上下文时,OLE 单元或上下文已经关闭。最常见的原因就是:在 STA 单元拥有的所有 COM 组件被完全释放之前,STA 单元已经关闭。从用户代码对 RCW 发出显式调用时,或 CLR 自行操作 COM 组件时(例如,在对关联的 RCW 已经进行垃圾回收之后,CLR 释放 COM 组件),就可能会发生这种情况。

解决办法

若要避免发生此问题,请确保在应用程序处理完单元中存在的所有对象之前,拥有 STA 的线程不会终止。上下文也是如此;请确保在应用程序处理完上下文中存在的所有 COM 组件之前,上下文不会关闭。

对运行库的影响

此 MDA 对 CLR 无任何影响。它只报告有关断开的上下文的数据。

输出

会报告断开的单元或上下文的上下文 Cookie。

配置

<mdaConfig>
  <assistants>
    <disconnectedContext enable="false" />
  </assistants>
</mdaConfig>

请参见

概念

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

Interop 封送处理概述

参考

MarshalAsAttribute

其他资源

互操作性