dirtyCastAndCallOnInterface MDA

更新:2007 年 11 月

如果试图通过 vtable 对一个已标记为仅限后期绑定的类接口进行早期绑定调用,则将激活 dirtyCastAndCallOnInterface 托管调试助手 (MDA)。

症状

当通过 COM 对 CLR 发出一个早期绑定调用时,应用程序引发一个访问冲突或出现意外行为。

原因

代码尝试在仅限后期绑定的类接口上通过 vtable 进行早期绑定调用。请注意,在默认情况下,类接口被标识为仅限后期绑定。也可以使用值为 AutoDispatchClassInterfaceAttribute 属性 ([ClassInterface(ClassInterfaceType.AutoDispatch)]) 将类接口标识为后期绑定。

解决办法

推荐的解决办法是:定义由 COM 使用的显式接口,并且通过此接口而不是自动生成的类接口来进行 COM 客户端调用。或者,通过 IDispatch 将从 COM 进行的调用转换为后期绑定调用。

最后,可以将此类标识为 AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]) 以允许从 COM 发出早期绑定调用;不过,由于 ClassInterfaceAttribute 中所述的版本限制,强烈建议您不要使用 AutoDual

对运行库的影响

此 MDA 对 CLR 无任何影响。它只报告有关对后期绑定接口发出的早期绑定调用的数据。

输出

以早期绑定方式访问的方法的名称或字段的名称。

配置

<mdaConfig>
  <assistants>
    <dirtyCastAndCallOnInterface />
  </assistants>
</mdaConfig>

请参见

概念

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

参考

ClassInterfaceAttribute

其他资源

互操作性