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 模式。dotent cli 默认使用的模式是 split-fx 模式,我们的示例站点 about.cnblogs.com 用的也是这种模式,通过下面的 tracing 信息可以看出来(export COREHOST_TRACE=2):这次旅程也因此选择“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的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

相关推荐: flink 1.11中的CDC是什么意思

本篇文章给大家分享的是有关flink 1.11中的CDC是什么意思,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。CDC,Change Data Capture,变更数据获取的简称,使用CDC我们可…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 10/06 17:35
Next 10/06 17:35

相关推荐