什么';lib中的.dll和.NETCore2.0SDK中的ref文件夹之间的区别是什么?

什么';lib中的.dll和.NETCore2.0SDK中的ref文件夹之间的区别是什么?,.net,dll,.net-core,.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

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等)分发各种实现程序集。NuGet软件包中的
lib
文件夹甚至可以用来添加更多私有实现程序集,这些程序集不希望消费应用程序直接引用

引用程序集只有“存根”方法,这样就可以定义可用的API表面,并且可以由编译器进行检查

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


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

这与完整框架没有根本区别,参考程序集位于c:\program files(x86)\reference Assembly中,并在生成程序时使用。运行时程序集位于c:\windows\microsoft.net\assembly中,并在运行程序时使用。这种区别最大限度地降低了实施变更破坏您的程序的风险。NETCore只会让你的磁盘乱七八糟,版本太多,程序集太多,标准太多,而且没有GAC。希望他们能尽快行动起来。
Microsoft.NET.Build.Extensions
实际上只是一个兼容性垫片,允许.NET标准1.0-2.0项目在.NET Framework 4.6.1上运行,该框架不包含所有必需的程序集和类型。。因此,它比经典的
ref
/
lib
拆分其他NuGet软件包更为特殊。添加NuGet软件包后,VisualStudio项目是否会指向“ref”文件夹?从上面的描述来看,似乎应该是这样。但是,在我的例子(VS2017)中,引用被添加到“lib”文件夹中的dll中。