SafeHandle 类型必须具有公共构造函数

过去,当 SafeHandle 派生类型作为 refout 参数或作为返回类型传递时,将 SafeHandle 派生类型传递给 P/Invoke 和 COM 方法隐式需要任何可见性的无参数构造函数。 通过 .NET 7 中源生成的互操作,此行为可以更轻松地从基于 DllImportAttribute 的 P/Invoke 进行迁移。 同时,我们更新了 SafeHandle 文档,告知实现者在其派生类型中提供 public 无参数构造函数。 此重大更改使该建议成为源生成的封送的一个要求。

旧行为

SafeHandle 派生类型在使用时需要具有任何可见性的无参数构造函数:

新行为

SafeHandle 派生类型在使用时需要具有 public 无参数构造函数:

如果该类型没有 public 无参数构造函数,互操作源生成器将发出编译错误。

引入的版本

.NET 8 预览版 5

中断性变更的类型

此项更改可能会影响源兼容性

更改原因

互操作源生成器将做出更改,以将更多代码从源生成器本身推送到核心 .NET 库中。 作为此更改的一部分,互操作团队开始强制实施建议的准则,使互操作代码更易于维护和理解。

SafeHandle 派生类型上的现有非 public 无参数构造函数更改为 public

受影响的 API