dirtyCastAndCallOnInterface MDA
如果尝试通过 vtable 对一个已标记为仅限后期绑定的类接口进行早期绑定调用,则将激活 dirtyCastAndCallOnInterface 托管调试助手 (MDA)。
症状
当通过 COM 对 CLR 发出一个早期绑定调用时,应用程序引发一个访问冲突或出现意外行为。
原因
代码尝试在仅限后期绑定的类接口上通过 vtable 进行早期绑定调用。 请注意,在默认情况下,类接口被标识为仅限后期绑定。 也可以使用值为 AutoDispatch 的 ClassInterfaceAttribute 特性 ([ClassInterface(ClassInterfaceType.AutoDispatch)]) 将类接口标识为后期绑定。
解决方法
推荐的解决办法是:定义由 COM 使用的显式接口,并且通过此接口而不是自动生成的类接口来进行 COM 客户端调用。 或者,通过 IDispatch 将从 COM 进行的调用转换为后期绑定调用。
最后,可以将此类标识为 AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]) 以允许从 COM 发出早期绑定调用;不过,由于 ClassInterfaceAttribute 中所述的版本限制,强烈建议您不要使用 AutoDual。
对运行时的影响
此 MDA 对 CLR 无任何影响。 它只报告有关对后期绑定接口发出的早期绑定调用的数据。
Output
以早期绑定方式访问的方法的名称或字段的名称。
配置
<mdaConfig>
<assistants>
<dirtyCastAndCallOnInterface />
</assistants>
</mdaConfig>