dirtyCastAndCallOnInterface MDA
注意
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
当尝试通过 vtable 对已标记为仅后期绑定的类接口进行早期绑定调用时,则会激活 dirtyCastAndCallOnInterface
托管调试助手 (MDA)。
症状
当通过 COM 将早期绑定调用放入 CLR 时,应用程序会引发访问冲突或产生意外行为。
原因
代码正经由仅后期绑定的类接口尝试通过 vtable 进行早期绑定调用。 请注意,默认情况下,类接口标识为仅后期绑定。 也可通过具有 AutoDispatch 值 ([ClassInterface(ClassInterfaceType.AutoDispatch)]
) 的 ClassInterfaceAttribute 特性将它们识别为后期绑定。
解决方法
建议的解决方法是定义供 COM 使用的显式接口,并让 COM 客户端可以通过此接口而非自动生成的类接口进行调用。 或者,从 COM 进行的调用可以经由 IDispatch
转换为后期绑定调用。
最后,可将类标识为 AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]
),以便可从 COM 放置早期绑定的调用;但是,由于 ClassInterfaceAttribute 中所述的版本管理限制,强烈建议不要使用 AutoDual。
对运行时的影响
此 MDA 对 CLR 无任何影响。 它仅报告对后期绑定接口的早期绑定调用的数据。
输出
按早期绑定访问的方法的名称或字段的名称。
Configuration
<mdaConfig>
<assistants>
<dirtyCastAndCallOnInterface />
</assistants>
</mdaConfig>