.NET Standard 2.0 使用的兼容性垫片
Compatibility shim used by .NET Standard 2.0
.NET Standard 2.0 的概述 (example) 说它现在使用某种兼容性垫片来修复第三方库兼容性问题。因此,您可以将第三方库与 .NET Standard 一起使用,直到它不使用 .NET Standard 没有的任何 API。
不清楚的是
- 这个垫片是如何工作的?有什么缺点吗?
和
- 如何查看是否支持第三方库?通过直接添加到项目中然后尝试编译?
这通过创建经典 .NET 库引用的所有必要库来实现。
例如在 .NET Core 中,Object
或 Attribute
的实现在 System.Runtime
中定义。编译代码时,生成的代码总是引用程序集和类型 => [System.Runtime]System.Object
。然而,经典 .NET 项目引用了 mscorlib
中的 System.Object
。当尝试在 .NET Core 1.0/1.1 上使用经典的 .NET 程序集时,这通常会导致找不到类型。在 .NET Core 2.0 中,mscorlib
中将有 "fake" 类型,运行 时间知道如何转发到实际实现的位置。
您可以阅读更多关于 assembly unification works on the dotnet/standard GitHub repo 的内容,但最重要的场景是这个(图片取自此存储库):
这显示了场景应该如何工作:当第 3 方 dll 引用 [mscorlib]Microsoft.Win32.RegistryKey
时,将有一个 mscorlib.dll
包含转发到 [Microsoft.Win32.Registry] Microsoft.Win32.RegistryKey
的类型,因此它将当存在 Microsoft.Win32.RegistryKey.dll
时工作。
这也显示了主要的缺点:注册表是一个仅 windows 的概念,在 Mac 或 Linux 上不可用,因此此特定代码可能无法 运行 在非 windows 平台上。但是如果你只使用库中没有使用这个功能的部分,它可能适用于跨平台的场景。
另一个问题是,即使 API 是 "available" 编译和引用,它仍然可能抛出 PlatformNotSupportedException
.
例如,实现序列化/反序列化文件格式的库可能无需修改即可工作,即使它是为 .NET Framework 3.5 构建的。
要查找特定库使用的 API 函数,.NET Portability Analyzer 可用于扫描 dll 并显示库是否兼容,如果不兼容,则 APIs正在阻塞。
.NET Standard 2.0 的概述 (example) 说它现在使用某种兼容性垫片来修复第三方库兼容性问题。因此,您可以将第三方库与 .NET Standard 一起使用,直到它不使用 .NET Standard 没有的任何 API。
不清楚的是
- 这个垫片是如何工作的?有什么缺点吗?
和
- 如何查看是否支持第三方库?通过直接添加到项目中然后尝试编译?
这通过创建经典 .NET 库引用的所有必要库来实现。
例如在 .NET Core 中,Object
或 Attribute
的实现在 System.Runtime
中定义。编译代码时,生成的代码总是引用程序集和类型 => [System.Runtime]System.Object
。然而,经典 .NET 项目引用了 mscorlib
中的 System.Object
。当尝试在 .NET Core 1.0/1.1 上使用经典的 .NET 程序集时,这通常会导致找不到类型。在 .NET Core 2.0 中,mscorlib
中将有 "fake" 类型,运行 时间知道如何转发到实际实现的位置。
您可以阅读更多关于 assembly unification works on the dotnet/standard GitHub repo 的内容,但最重要的场景是这个(图片取自此存储库):
这显示了场景应该如何工作:当第 3 方 dll 引用 [mscorlib]Microsoft.Win32.RegistryKey
时,将有一个 mscorlib.dll
包含转发到 [Microsoft.Win32.Registry] Microsoft.Win32.RegistryKey
的类型,因此它将当存在 Microsoft.Win32.RegistryKey.dll
时工作。
这也显示了主要的缺点:注册表是一个仅 windows 的概念,在 Mac 或 Linux 上不可用,因此此特定代码可能无法 运行 在非 windows 平台上。但是如果你只使用库中没有使用这个功能的部分,它可能适用于跨平台的场景。
另一个问题是,即使 API 是 "available" 编译和引用,它仍然可能抛出 PlatformNotSupportedException
.
例如,实现序列化/反序列化文件格式的库可能无需修改即可工作,即使它是为 .NET Framework 3.5 构建的。
要查找特定库使用的 API 函数,.NET Portability Analyzer 可用于扫描 dll 并显示库是否兼容,如果不兼容,则 APIs正在阻塞。