.NET Core 2.0 SDK中lib和ref文件夹中的.DLL之间的区别是什么?

时间:2017-08-17 09:48:03

标签: .net dll .net-core

.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字节)

他们之间有什么区别(以及有两个人的目的)?

1 个答案:

答案 0 :(得分:6)

正如Hans Passant已经提到的,“引用”程序集用于构建程序,这意味着这是作为引用传递给编译器的程序集。但是,在运行时,实现可能会有所不同。除了框架本身,任何NuGet包都可以使用它,它分发单个编译时引用程序集,但为每个目标(.NET Core,.NET Framework,MonoAndroid等)分发各种实现程序集。 NuGet包中的lib文件夹甚至可用于添加更多私有实现程序集,它们不希望消费应用程序直接引用。

引用程序集只有“stub”方法,因此可以定义可用的API表面,并且可以由编译器进行检查。

但是,您提到的是Microsoft.NET.Build.Extensions文件夹。它遵循NuGet包的结构(因为它是如何构建并集成到SDK中的),但它与您使用的普通库有着完全不同的目的。它用于允许.NET标准库在部分兼容的.NET Framework版本上运行。它的工作原理是将实现程序集添加到构建输出中 - 但这些是特殊的,因为它们只转发到相应的.NET Framework类型并添加API表面,该表面抛出PlatformNotSupportedException用于.NET Standard中可用但未实现的类型通过.NET Framework。例如。 .NET标准1. *库将引用System.Object中的System.Runtime.dll,.NET Standard 2.0库将引用netstandard.dllMicrosoft.NET.Build.Extensions包含System.Runtime.dllnetstandard.dll,其中包含转发到.NET Framework mscorlib.dll的转发声明类型。这适用于其他类型和程序集。

仅在必要时添加这些程序集。 .NET Framework 4.7.1将包含所有这些程序集和转发,因此不会将其他文件添加到构建输出中。