.NET标准2.0的概述(example)表示它现在使用某种兼容性填充程序修复了第三方库兼容性问题。因此,您可以将第三方库与.NET Standard一起使用,直到它不使用.NET Standard没有的任何API。
不清楚的是
和
答案 0 :(得分:26)
这可以通过创建经典.NET库引用的所有必需库来实现。
E.g。在.NET Core中,Object
或Attribute
的实现在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,但最重要的情况是这个(从此存储库中获取的图像):
这显示了该方案应该如何工作:当第三方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阻止。