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