为什么 .NET Standard 2 构建引用许多程序集而不是单个 netstandard.dll 程序集
Why .NET Standard 2 build references many assemblies instead of single netstandard.dll assembly
与 .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
。
这是历史的遗憾。
你是对的,理论上构建 .NET Standard 库只需要 netstandard.dll
。
然而,有两件事使这变得复杂:
- .NET Standard 1.0-1.6 库使用了更多的 NuGet 包和程序集。因此,.NET Standard 1.6 库(.dll 文件)可能包含对例如
System.Collections.Generic.dll
可解析。此外,构建系统需要知道 1.6 库期望在此 dll 中的 类 实际上与 netstandard.dll
. 中的相同。
- 允许从 .NET Standard(和 .NET Core)库中使用现有的 .NET Framework 库,而无需重新编译。这意味着它们也是为 .NET Framework 使用的
.dll
文件构建的 - 从 mscorlib.dll
到单独的框架 dll。
对于这两个,添加了对具有这些名称(和版本)的程序集的引用,其中仅包含类型前向声明。因此,例如 mscorlib.dll
将包含一个用 "go look for that in netstandard.dll
".
标记的空 System.Object
条目
与 .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
。
这是历史的遗憾。
你是对的,理论上构建 .NET Standard 库只需要 netstandard.dll
。
然而,有两件事使这变得复杂:
- .NET Standard 1.0-1.6 库使用了更多的 NuGet 包和程序集。因此,.NET Standard 1.6 库(.dll 文件)可能包含对例如
System.Collections.Generic.dll
可解析。此外,构建系统需要知道 1.6 库期望在此 dll 中的 类 实际上与netstandard.dll
. 中的相同。
- 允许从 .NET Standard(和 .NET Core)库中使用现有的 .NET Framework 库,而无需重新编译。这意味着它们也是为 .NET Framework 使用的
.dll
文件构建的 - 从mscorlib.dll
到单独的框架 dll。
对于这两个,添加了对具有这些名称(和版本)的程序集的引用,其中仅包含类型前向声明。因此,例如 mscorlib.dll
将包含一个用 "go look for that in netstandard.dll
".
System.Object
条目