【问题标题】:What's the difference between .DLLs in lib and ref folders in .NET Core 2.0 SDK?.NET Core 2.0 SDK 中的 lib 和 ref 文件夹中的 .DLL 有什么区别?
【发布时间】:2018-01-25 16:08:47
【问题描述】:

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

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

【问题讨论】:

  • 这与完整的框架没有根本的不同,参考程序集位于 c:\program files (x86)\reference 程序集中,并在您构建程序时使用。运行时程序集位于 c:\windows\microsoft.net\assembly 中,并在您运行程序时使用。这种区别将实现更改破坏程序的风险降至最低。 .NETCore 只会把你的磁盘弄得更糟,版本太多,程序集太多,标准太多,而且没有 GAC。希望他们很快能齐心协力。
  • Microsoft.NET.Build.Extensions 实际上只是一个兼容性垫片,允许 .NET Standard 1.0-2.0 项目在不包含所有必要程序集和类型的 .NET Framework 4.6.1 上运行。所以它比经典的ref/lib拆分其他NuGet包更特别。

标签: .net dll .net-core


【解决方案1】:

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

引用程序集只有“存根”方法,以便定义可用的 API 表面并可由编译器检查。

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

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

【讨论】:

  • 添加 nuget 包后,VisualStudio 项目是否会指向“ref”文件夹?从上面的描述来看,应该是这样的。但是,在我的情况下(VS2017),引用被添加到“lib”文件夹中的 dll 中。
猜你喜欢
  • 2019-08-04
  • 2010-12-19
  • 2018-05-23
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多