自 .NET 5 起,可以将实现 IDispatchEx 的 COM 对象强制转换为 IReflect。 但是,该 IReflect 实例上的所有成员都抛出 TypeLoadException。 从 .NET 10 开始,此行为发生变化,转换现在会失败。
引入的版本
.NET 10
以前的行为
以前,将实现 IDispatchEx 的 COM 对象转换为 IReflect 是成功的。
using System.Reflection;
var file = Activator.CreateInstance(Type.GetTypeFromProgID("htmlfile"));
Console.WriteLine("IReflect is " + (file is IReflect ? "supported" : "NOT supported"));
// Printed "IReflect is supported".
新行为
从 .NET 10 开始,将实现 IDispatchEx 的 COM 对象转换为 IReflect 时会失败。
using System.Reflection;
var file = Activator.CreateInstance(Type.GetTypeFromProgID("htmlfile"));
Console.WriteLine("IReflect is " + (file is IReflect ? "supported" : "NOT supported"));
// Prints "IReflect is NOT supported".
破坏性变更的类型
此更改为行为更改。
更改原因
此功能已被删除,因为生成的 IReflect 实例上的所有成员都不可用。 此外, TypeLoadException 由于访问任何成员而引起的异常,该类型从未包含在 .NET 中,因此对基础问题感到困惑和无益。
建议的措施
在 .NET 5+ 中使用此类型转换所能提出的唯一可行问题是:“类型是否实现了 IDispatchEx?” 在这种情况下,提出该问题的更好方法是:
var file = Activator.CreateInstance(Type.GetTypeFromProgID("htmlfile"));
Console.WriteLine("IDispatchEx is " + (file is IDispatchEx ? "supported" : "NOT supported"));
[ComImport]
[Guid("A6EF9860-C720-11D0-9337-00A0C90DCAA9")]
interface IDispatchEx { }
受影响的 API
没有。