千家信息网

corehost是怎么加载coreclr的

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章给大家介绍corehost是怎么加载coreclr的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在 探秘 dotnet run 如何运行 .NET Core 应用程序
千家信息网最后更新 2025年12月01日corehost是怎么加载coreclr的

这篇文章给大家介绍corehost是怎么加载coreclr的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

在 探秘 dotnet run 如何运行 .NET Core 应用程序 中,在好奇心的驱使下,探秘了 dotnet run ,发现了神秘的 corehost -- 运行 .NET Core 应用程序的幕后英雄。有时神秘就是一种诱惑,神秘的 corehost 让人产生了新的好奇心 -- corehost 是如何加载 coreclr 的?于是,".NET跨平台之旅"开启了新的旅程 -- 带着这个疑问,游览cli/src/corehost/ 。

corehost 的入口是 corehost.cpp 的 main() ,进来后一条大道通向 corehost.run() 。

在 corehost.run() 中,首先调用的是 libhost.cpp 中的 detect_operating_mode() ,它根据 coreclr 所在的路径决定 corehost 的运行模式,有三种运行模式:muxer, standalone, split-fx。如果 corehost 与 coreclr 不在同一个文件夹,运行模式则是 muxer 。如果 corehost 与 coreclr 在同一个文件夹,并且文件夹下存在 .deps.json 文件或者不存在 .runtimeconfig.json 文件,则是 standalone 模式;否则是 split-fx 模式。

return ((pal::file_exists(own_deps_json)         || !pal::file_exists(own_config_filename))     && pal::file_exists(own_dll)) ?     host_mode_t::standalone : host_mode_t::split_fx;

dotent cli 默认使用的模式是 split-fx 模式,我们的示例站点 about.cnblogs.com 用的也是这种模式,通过下面的 tracing 信息可以看出来(export COREHOST_TRACE=2):

Checking if CoreCLR path exists=[/usr/share/dotnet-nightly/bin/libcoreclr.so]Detecting mode... CoreCLR present in own dir [/usr/share/dotnet-nightly/bin] and checking if [corehost.deps.json] file present=[0]Host operating in split mode; own dir=[/usr/share/dotnet-nightly/bin]

这次旅程也因此选择"split-fx 模式"这条游览路线。

针对 split-fx 模式,corehost.run() 接着会调用 hostpolicy.cpp 的 run() 方法(通过 corehost_init_t ),run() 方法中调用 deps_resolver.cpp 的resolve_coreclr_dir() 解析 coreclr 所在的路径,然后调用 coreclr.cpp 的 bind() 与 initialize() 方法加载 coreclr 。

在 bind() 方法中,根据之前解析出的 coreclr 路径,调用 pal.unix.cpp(针对的是Linux运行环境)的 load_library() 打开 coreclr 的库文件 libcoreclr.so (实际是调用 Linux 的 C 函数 dlopen() ),从而得到 coreclr 中3个函数(coreclr_initialize, coreclr_shutdown,coreclr_execute_assembly)的句柄。

在 initialize() 方法中,根据 bind() 中得到的句柄调用 coreclr 的 coreclr_initialize() 方法启动 coreclr , 加载 coreclr 的工作就这样完成了。

找到 coreclr 库文件所在的位置,打开它,调用它的 coreclr_initialize() 方法,corehost 加载 coreclr 就这么简单。如果你有兴趣,可以用 C++ 写一个自己的 corehost 。

关于corehost是怎么加载coreclr的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

模式 方法 运行 文件 所在 文件夹 路径 好奇 兴趣 内容 函数 句柄 好奇心 库文件 应用程序 旅程 更多 程序 帮助 应用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库在创建主键约束 重庆太智互联网科技有限公司 互联网服务器网络怎么设置 西藏互联网养老软件开发专业制作 网络安全的出路 2017网络安全小品 子目录站点连接不上数据库 关系数据库的读写都会锁库么 常见的网络安全问题有哪些图片 数据库中概要设计是什么 毕业设计规划嵌入式软件开发 数据库表的左右连接 数据库技术基础题目 数据库 批量查询 数据库查找成绩不及格的学生 铝团上海互联网科技有限公司 mysql数据库被远程连接 网络技术服务是指哪些 网络安全测评机构资质证书 招聘网络技术专业 服务器公网和内网ip 蛤蟆工具连接数据库 软件开发人员怎么判刑 方舟开服务器下载什么软件 青海省虚拟服务器管理软件云主机 网络安全盐城电信 爬虫技术获取微博数据库 腾讯软件开发实习生待遇 服务器远程管理如何登录 铁鱼网络技术有限公司
0