是否可以使用新的 project.json 文件将 NuGet 包添加到标准 .NET 4.6 类库?如果是这样,怎么做?
1 回答
是否可以使用新的 project.json 文件将 NuGet 包添加到标准 .NET 4.6 类库?
我不确定“标准”是什么意思,但如果您在完整的 .NET 运行时中运行,那么不会。
加载依赖项的责任在于运行时。CoreCLR 运行时使用coreclr.dll
与使用clr.dll
.
使用 CoreCLR 时,LoaderContainer
使用的 知道project.json
文件,因此在那里搜索要加载的依赖项。卸载依赖项的过程在 ASP.NET 5 文档中的DNX 结构中进行了描述。
如果你真的想深入了解它是如何完成的,你可以查看DefaultHost.cs
和了解 GitHub 上ApplicationHostContext.cs
的aspnet/dnx解决方案。
第 1 层:CLR 本机主机:
该层特定于您正在使用的 CLR 版本,并具有两个主要职责:
引导 CLR,如何实现取决于 CLR 的版本。对于 Core CLR,该过程涉及加载 coreclr.dll、配置和启动运行时,以及创建所有托管代码将在其中运行的 AppDomain。
调用托管入口点,第 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 等加载程序集。
调用程序集的入口点,其名称作为本机进程的下一个参数给出