dirtyCastAndCallOnInterface MDA

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

症状

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

原因

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

解决方法

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

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

对运行时的影响

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

Output

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

配置

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

请参见

参考

ClassInterfaceAttribute

概念

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

其他资源

互操作性