SafeHandle 类型必须具有公共构造函数
过去,当 SafeHandle
派生类型作为 ref
或 out
参数或作为返回类型传递时,将 SafeHandle 派生类型传递给 P/Invoke 和 COM 方法隐式需要任何可见性的无参数构造函数。 通过 .NET 7 中源生成的互操作,此行为可以更轻松地从基于 DllImportAttribute 的 P/Invoke 进行迁移。 同时,我们更新了 SafeHandle 文档,告知实现者在其派生类型中提供 public
无参数构造函数。 此重大更改使该建议成为源生成的封送的一个要求。
旧行为
SafeHandle 派生类型在使用时需要具有任何可见性的无参数构造函数:
- 在 LibraryImportAttribute 特性化方法中作为
ref
或out
参数或作为返回类型。 - 在 GeneratedComInterfaceAttribute 特性化接口上的一个方法中。
新行为
SafeHandle 派生类型在使用时需要具有 public
无参数构造函数:
- 在 LibraryImportAttribute 特性化方法中作为
ref
或out
参数或作为返回类型。 - 在 GeneratedComInterfaceAttribute 特性化接口上的一个方法中。
如果该类型没有 public
无参数构造函数,互操作源生成器将发出编译错误。
引入的版本
.NET 8 预览版 5
中断性变更的类型
此项更改可能会影响源兼容性。
更改原因
互操作源生成器将做出更改,以将更多代码从源生成器本身推送到核心 .NET 库中。 作为此更改的一部分,互操作团队开始强制实施建议的准则,使互操作代码更易于维护和理解。
建议的操作
将 SafeHandle
派生类型上的现有非 public
无参数构造函数更改为 public
。