.NET Core 中的 *deps.json 文件

Posted

技术标签:

【中文标题】.NET Core 中的 *deps.json 文件【英文标题】:The *deps.json file in .NET Core 【发布时间】:2018-03-19 05:26:24 【问题描述】:

.NET Core 中 *deps.json 文件的用途是什么? 将引用存储在此类文件中而不是程序集清单中的原因是什么(如在独立的 .NET Framework 中)?

使用 Ildasm 我检查了程序集清单在 dotnet build 命令之后不包含这些依赖项的条目。

但它在 dotnet publish 命令之后有条目。

【问题讨论】:

是的,你不想看得太近,可怕的东西希望它不会持续太久。这曾经存在于 project.json 中,但还没有真正消失。这是他们处理 .NETCore v1 的方式的副作用,他们将框架程序集分解成许多微小的组件。理论上,将它们移植到 MacOS 和许多 Linux 版本并在处理它的同时进行更改会更容易。计划是回到大的,不知道什么时候执行。 @Hans_Passant 与 .NetCore v3 有什么不同,还是需要这些 `.deps.json' 文件? 【参考方案1】:

.deps.json 文件包含有关已构建程序集引用的程序集的元数据、搜索它们的位置以及有关使用的编译选项的信息。

此信息由加载和配置运行时的本机组件 (corehost) 读取。当需要加载引用的程序集时,主机将使用此文件中的信息(以及任何runtimeconfig.json/runtimeconfig.dev.json)来定位要加载的正确程序集。

此信息也用于其他地方。例如 ASP.NET Core 的 Razor 视图编译也使用它来将正确的引用和配置传递给生成的代码。当单元测试库加载到测试主机时,单元测试主机也需要使用该文件中的信息。 Microsoft.Extensions.DependencyModel NuGet 包中提供了用于读取和写入此文件的托管 API。

【讨论】:

我阅读了有关 corehost 的文章,据我了解,它完全忽略了程序集清单。要加载的程序集 = 目录中的程序集 + .deps 文件中的程序集我正确吗? 另外,在我的 Mac 中,所有基础库都是从 /usr/local/share/dotnet/shared 加载的。此路径未在任何地方描述。 是的,只要 CoreCLR 需要一个由它必须使用的 IL 引用的程序集,就会解析程序集。完整的 CLR 也是如此。清单部分对于非 .NET /“本机”DLL 更为重要,因为与 IL 相比,本机代码不包含程序集引用,因此元数据需要告诉链接器在启动时要加载哪些文件,以便所有使用的符号都是已解决。 当然可以,但是它怎么知道类型在哪里的程序集呢?据我了解,在完整的 .NET 中,它在启动时读取主程序集清单并为所有引用的程序集加载元数据部分。然后,在运行时,当某个类型被引用时,它会知道它来自哪个程序集并加载该程序集。 始终使用程序集名称引用类型。例如,new DirectoryEntry(); 在 IL 中将变为 newobj instance void [System.DirectoryServices]System.DirectoryServices.DirectoryEntry::.ctor(),CLR 将搜索匹配 System.DirectoryServices 的程序集。

以上是关于.NET Core 中的 *deps.json 文件的主要内容,如果未能解决你的问题,请参考以下文章

NET Core 基础:deps.json, runtimeconfig.json 以及 dll

深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件

使用 .NET Framework 集成测试 ASP.NET Core - 找不到 deps.json

ASP.NET Core 共享第三方依赖库部署的Bug(*.deps.json on 2.2.0 or 4.6.0 版本)

我在 asp dot net core 中创建控制器但出现错误

指定的deps.json [path\App.Web.Site\App.Web.deps.json] 不存在