CreateObjectFlags.Unwrap 仅在目标实例上展开

以前,如果在具有 CreateObjectFlags.Unwrap 标志的 ComWrappers 实例上调用 GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags),则会从任何 ComWrappers 实例展开托管对象包装器。 现在,指定标志后,只会展开调用了 GetOrCreateObjectFromComInstanceComWrappers 实例中的包装器。

Unwrap 标志是唯一到达“跨”ComWrappers 实例的 API,因此其行为不直观。 此外,新的 ComWrappers.TryGetObject(IntPtr, Object) API 可用于从任何 ComWrappers 实例展开 COM 对象。

旧行为

在具有 CreateObjectFlags.Unwrap 标志的 ComWrappers 实例上调用 GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags) 会从任何 ComWrappers 实例展开托管对象包装器。

新行为

在具有 CreateObjectFlags.Unwrap 标志的 ComWrappers 实例上调用 GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags) 只会展开调用了 GetOrCreateObjectForComInstanceComWrappers 实例中的托管对象包装器。 如果给定了来自其他 ComWrappers 实例的包装器,ComWrappers 实例将创建新的包装器。

引入的版本

.NET 8 预览版 5

中断性变更的类型

此更改为行为更改

更改原因

之前的行为不直观。 它还打破了封装体验,开发人员可以使用自己的自定义 ComWrappers 实例来定义 COM 互操作如何为其代码工作。

如果要保留以前的行为,请先调用 ComWrappers.TryGetObject(IntPtr, Object),然后再调用 GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags)

受影响的 API