为什么 System.Security.Cryptography.Xml 不是 .NET Standard 2.0 的一部分?

Why is System.Security.Cryptography.Xml not part of .NET Standard 2.0?

命名空间 System.Security.Cryptography 中的几乎所有类型都是 .NET Standard 2.0 的一部分,但 System.Security.Cryptography.Xml one needs to take a dependency on the extension package by the same name 除外,这一事实让我有些困惑。

有人可以解释一下这里的困难吗?如果问题只是人和时间不够,是否有任何计划将其包含在下一版本的 .NET Standard 中?

我的印象是您认为 "can" 的东西会进入 netstandard,但实际上 "have to".

更像是进入 netstandard

虽然这不是实际过程,但一个好的模型是:

  • 规则0:如果ECMA-335规范中提到了该类型,则属于netstandard。
    • 这些类型与其运行时(clr.dll、核心clr.dll、libcoreclr.so 等)有特殊的交互,因此无法通过 NuGet 包合理地定义。
  • 规则 1:如果 "foundational" 类型在(几乎?)所有操作环境中都有意义,但系统库最好 [=7​​1=],它可能属于 netstandard(因为它很难交付有效地通过 NuGet)。
    • 所有加密算法实现都在这个桶中
    • 还有网络
    • 全球化也是如此
  • 规则 2:如果某个类型已存在于 netstandard 中,则该类型需要在 netstandard 中。
    • 密码学基础类
    • 好的,几乎所有的网络标准
    • 举个例子:netstandard3.0 当前提议的更改包括定义.NET Core 添加到现有网络标准类型的 (ReadOnly)Span 和 (ReadOnly)Memory-based 方法,这意味着 (ReadOnly)Span 和(只读)内存必须从 "on netstandard" 变为 "in netstandard"。

netstandard 中定义的事物需要兼容的实现来定义其中的所有事物(尽管“throw new PlatformNotSupportedException();”是任何事物的合法实现)。所以 .NET Framework、.NET Core、Mono、Xamarin、Unity(以及我想不到的任何其他)都需要定义一个东西。有时 code 在这些运行时之间共享,但每个运行时都有自己的功能实现;并且修复其中一个中的错误需要修复所有 5+ 中的错误(或者,至少,发布对所有 5+ 的更新)。

另一方面,当功能可以纯粹根据 netstandard 中已有的东西交付时,这些东西非常适合托管在 NuGet 上,并且相同的 DLL 可以加载到所有 5+ 运行时并正常工作.当一个错误被修复时,它会在所有地方得到修复1,2。所有人都有很多好处。这些库使用 netstandard 版本的 Target Framework Moniker (TFM),然后它们有效地扩展了 netstandard。唯一的缺点是消费者需要显式地添加包引用来构建。 System.Security.Cryptography.XmlSystem.Security.Cryptography.Pkcs 都在这个桶中。


1。 .NET Framework(或 Xamarin 等)中已有的类型仍然必须在该运行时中独立修复,因为 NuGet 包表示忽略其内容并使用这些平台上的现有实现。

2。对于 .NET Core,当需要一个程序集作为运行时的实现细节时,它会包含在 Microsoft.NETCore.App 中,而 NuGet 包表示忽略其内容并使用该平台上的现有实现,这意味着该错误得到已修复一次,但必须同时作为 .NET Core 更新和 NuGet 包发布。