为什么.NET Standard 2内部版本引用许多程序集而不是单个netstandard.dll程序集

时间:2019-05-15 11:58:17

标签: .net .net-core .net-standard .net-standard-2.0

与.NET Standard 1不同,.NET Standard 2引入了单个netstandard.dll参考程序集。

但是,当使用dotnet build进行编译(使用.NET Core SDK 2.2.203)时,我们可以看到它添加了对许多程序集(113)的引用,这些引用都在netstandard.library/2.0.3/build/netstandard2.0/ref/*.dll下。这些引用之一是netstandard.dll

$ grep TargetFramework *.csproj
<TargetFramework>netstandard2.0</TargetFramework>
$ dotnet build --verbosity normal | grep -o netstandard.library/2.0.3/build/netstandard2.0/ref | wc -l
113

生成的程序集确实包含对netstandard的单个引用:

$ ikdasm test.exe | grep extern
.assembly extern netstandard

问题是为什么netstandard.library的NuGet程序包包含所有这些其他程序集,为什么在构建过程中使用它们,而不是引用单个netstandard.dll

1 个答案:

答案 0 :(得分:2)

可悲的是由于历史。

您是正确的,从理论上讲,仅需要netstandard.dll即可构建.NET标准库。

但是,有两件事使这变得复杂:

  1. .NET Standard 1.0-1.6库使用了更多的NuGet软件包,因此使用了程序集。因此.NET Standard 1.6库(.dll文件)可能包含对例如System.Collections.Generic.dll可以解决。另外,构建系统需要知道1.6库在此dll中期望的类实际上与netstandard.dll中的类相同。
  2. 允许从.NET Standard(和.NET Core)库中使用现有的.NET Framework库,而无需重新编译。这意味着它们也已为.NET Framework使用的.dll文件构建-从mscorlib.dll到各个框架dll。

对于这两种方法,都添加了对具有这些名称(和版本)的程序集的引用,这些程序集仅包含类型正向声明。因此,例如mscorlib.dll将包含一个空的System.Object条目,该条目标记为“在netstandard.dll中寻找该条目”。