.NET Standard 2.0

时间:2017-06-09 18:54:38

标签: .net-core .net-standard

.NET标准2.0的概述(example)表示它现在使用某种兼容性填充程序修复了第三方库兼容性问题。因此,您可以将第三方库与.NET Standard一起使用,直到它不使用.NET Standard没有的任何API。

不清楚的是

  • 这个垫片是如何工作的?任何缺点?

  • 如何检查是否支持第三方库?通过直接将其添加到项目中然后尝试编译?

1 个答案:

答案 0 :(得分:26)

这可以通过创建经典.NET库引用的所有必需库来实现。

E.g。在.NET Core中,ObjectAttribute的实现在System.Runtime中定义。编译代码时,生成的代码总是引用程序集,类型=> [System.Runtime]System.Object。然而,经典.NET项目引用System.Object中的mscorlib。尝试在.NET Core 1.0 / 1.1上使用经典.NET程序集时,通常会导致找不到类型。在.NET Core 2.0中,mscorlib中将存在“假”类型,运行时知道如何转发到实现的实际位置。

您可以详细了解这个assembly unification works on the dotnet/standard GitHub repo,但最重要的情况是这个(从此存储库中获取的图像):

mscorlib facade

这显示了该方案应该如何工作:当第三方dll引用[mscorlib]Microsoft.Win32.RegistryKey时,会有mscorlib.dll包含转发到[Microsoft.Win32.Registry] Microsoft.Win32.RegistryKey的类型,因此它将在存在Microsoft.Win32.RegistryKey.dll

这也显示了主要的缺点:注册表是一个仅限Windows的概念,在Mac或Linux上不可用,因此这个特定的代码可能无法在非Windows平台上运行。但是,如果您仅使用不使用此功能的库的某些部分,则它可能适用于跨平台方案。

另一个问题是,即使API“可用”进行编译和引用,它仍然可能会抛出PlatformNotSupportedException

例如,实现序列化/反序列化的文件格式的库可能无需修改即可工作,即使它是为.NET Framework 3.5构建的。

要查找特定库使用的API函数,.NET Portability Analyzer可用于扫描dll并显示库是否兼容,如果不兼容,哪些API阻止。