1

是否可以使用新的 project.json 文件将 NuGet 包添加到标准 .NET 4.6 类库?如果是这样,怎么做?

4

1 回答 1

2

是否可以使用新的 project.json 文件将 NuGet 包添加到标准 .NET 4.6 类库?

我不确定“标准”是什么意思,但如果您在完整的 .NET 运行时中运行,那么不会。

加载依赖项的责任在于运行时。CoreCLR 运行时使用coreclr.dll与使用clr.dll.

使用 CoreCLR 时,LoaderContainer使用的 知道project.json文件,因此在那里搜索要加载的依赖项。卸载依赖项的过程在 ASP.NET 5 文档中的DNX 结构中进行了描述。

如果你真的想深入了解它是如何完成的,你可以查看DefaultHost.cs和了解 GitHub 上ApplicationHostContext.csaspnet/dnx解决方案。

第 1 层:CLR 本机主机:

该层特定于您正在使用的 CLR 版本,并具有两个主要职责:

  1. 引导 CLR,如何实现取决于 CLR 的版本。对于 Core CLR,该过程涉及加载 coreclr.dll、配置和启动运行时,以及创建所有托管代码将在其中运行的 AppDomain。

  2. 调用托管入口点,第 2 层。当本机主机的入口点返回时,此进程将清理并关闭 CLR。即卸载应用程序域并停止运行时。

第 2 层:托管入口点

该层是用托管代码编写的第一层,它负责:

  • 创建将包含所需 ILoader 的 LoaderContainer。ILoader 负责按名称加载程序集。当 CLR 要求解析程序集时,LoaderContainer 将使用其 ILoaders 解析所需的程序集。

  • 从运行本机进程时提供的 --lib 提供将加载程序集并满足依赖关系的根 ILoader。这通常是 DNX 包本身。

  • 调用所提供程序的主入口点。

第 3 层:应用程序主机/应用程序

如果用户将他们的整个应用程序编译为 libpath 中磁盘上的程序集,那么这一层就是您的应用程序。为此,您在 [ProgramName] 参数中传递包含应用程序入口点的程序集的名称,第 2 层将直接调用它。但是,在所有其他情况下,您将使用应用程序主机来解决应用程序依赖项并运行您的应用程序。Microsoft.Net.ApplicationHost 是运行时中提供的应用程序宿主,并有一些职责:

  • 遍历 project.json 中的依赖项并构建应用程序将使用的依赖项的闭包。在依赖解析文档中更详细地描述了依赖遍历逻辑

  • 向 LoaderContainer 添加一个 ILoader,它可以从各种源、NuGet、Roslyn 等加载程序集。

  • 调用程序集的入口点,其名称作为本机进程的下一个参数给出

于 2015-11-19T09:45:03.123 回答