.NET Core 2.0 SDK 中的每个 DLL 都有两个副本(它们具有不同的内容和文件大小)。例如:
“c:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\ref\System.Threading.Thread.dll”(14432 字节)
“c:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Threading.Thread.dll”(14352 字节)
它们之间有什么区别(以及拥有两个的目的)?
请您参考如下方法:
因此,正如 Hans Passant 已经提到的,“引用”程序集用于构建程序,这意味着这是作为引用传递给编译器的程序集。然而,在运行时,实现可能会有所不同。除了框架本身之外,任何 NuGet 包都可以使用它,这些包分发单个编译时引用程序集,但每个目标(.NET Core、.NET Framework、MonoAndroid 等)都有各种实现程序集。 lib
NuGet 包中的文件夹甚至可用于添加更多不希望使用应用程序直接引用的私有(private)实现程序集。
引用程序集只有“ stub ”方法,以便定义可用的 API 表面并可由编译器检查。
但是,您提到的是 Microsoft.NET.Build.Extensions
文件夹。它遵循 NuGet 包的结构(因为它是如何构建和集成到 SDK 中的),但它的用途与您使用的普通库完全不同。它用于允许 .NET Standard 库在部分兼容的 .NET Framework 版本上运行。它通过将实现程序集添加到构建输出来工作 - 但这些是特殊的,因为它们仅转发到相应的 .NET Framework 类型并添加引发 PlatformNotSupportedException
的 API 表面适用于 .NET Standard 中可用但未由 .NET Framework 实现的类型。例如。 .NET Standard 1.* 库将引用 System.Object
来自 System.Runtime.dll
.NET Standard 2.0 库将从 netstandard.dll
引用它. Microsoft.NET.Build.Extensions
包含两个 System.Runtime.dll
和 netstandard.dll
包含要转发到 .NET Framework 的 mscorlib.dll
的类型转发声明.这对其他类型和程序集类似。
这些程序集仅在必要时添加。 .NET Framework 4.7.1 将包含所有这些程序集和转发,因此不会将其他文件添加到生成输出中。