.net - 为什么 .NET Standard 2 构建引用许多程序集而不是单个 netstandard.dll 程序集
问题描述
与 .NET Standard 1 不同,.NET Standard 2 引入了单个netstandard.dll
引用程序集。
但是,当使用 .NET Core SDK 2.2.203 进行编译时,dotnet build
我们可以看到它添加了对许多程序集 (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
.
解决方案
可悲的是,这是历史造成的。
你是对的,理论上只netstandard.dll
需要构建一个 .NET Standard 库。
然而,有两件事使这变得复杂:
- .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 库,而无需重新编译。这意味着它们也是为
.dll
.NET Framework 使用的文件构建的——从mscorlib.dll
单个框架 dll。
对于这两者,添加了对具有这些名称(和版本)的程序集的引用,其中仅包含类型前向声明。因此,例如将包含一个标有“go look for that in ”mscorlib.dll
的空条目。System.Object
netstandard.dll
推荐阅读
- javascript - 如何使用浏览器的 PDF 查看器打开 PDF Blob 而不是下载?
- reactjs - 使用 Typescript 在 React 中作为状态的两个字符串之一
- mysql - 以汇总方式连接不相关的表
- visual-studio-code - VSCode 上的运算符周围的间距
- amazon-s3 - 如何为 AWS S3 存储桶禁用 TLS 1.0
- scala - 为什么在运行sbt打包的jar文件时会出现这个jni错误?
- session - Apache Tomee 会话管理与 gemFire 集成
- amazon-web-services - AWS lambda nodejs 在使用 X-RAY 时显示错误
- python - 烧瓶 whooshalchemy 错误:ModuleNotFoundError:没有名为“flask.ext”的模块
- python - 如果在调试模式下我得到 200 OK,如何修复 CherryPy 中的 404 错误?