.NET跨平台之旅:corehost 是如何加载 coreclr 的 企
来源:互联网 发布:js二级联动省市代码 编辑:程序博客网 时间:2024/06/06 03:06
在前一篇博文中,在好奇心的驱使下,探秘了 dotnet run ,www.xzpxxw.com发现了神秘的 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 模式;www.xzpxxw.com否则是 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 模式,www.xzpxxw.com我们的示例站点 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]
这次旅程也因此选择www.xzpxxw.com“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() ),www.xzpxxw.com从而得到 coreclr 中3个函数(coreclr_initialize, coreclr_shutdown, coreclr_execute_assembly)的句柄。
在 initialize() 方法中,根据 bind() 中得到的句柄调用 coreclr 的 coreclr_initialize() 方法启动 coreclr , 加载 coreclr 的工作就这样完成了。
找到 coreclr 库文件所在的位置,打开它,调用它的 coreclr_initialize() 方法,corehost 加载 coreclr 就这么简单。如果你有兴趣,可以用 C++ 写一个自己的 corehost 。
开源的 .NET 变得更有意思,即使没有任何文档,即使没有正式发布,你也可以通过源码学习它,了解它。
- .NET跨平台之旅:corehost 是如何加载 coreclr 的 企
- CoreCLR源码探索(六) NullReferenceException是如何发生的
- .Net开源之corefx、coreclr初探(一)
- .Net开源之corefx、coreclr初探(二)
- .Net开源之corefx、coreclr初探(三)
- 微软开源.NET Core的执行引擎CoreCLR
- 微软开源.NET Core的执行引擎CoreCLR
- java是如何实现跨平台的
- Java是如何实现跨平台的
- java是如何实现跨平台的
- .NET CoreCLR开发人员指南(上)
- activity是如何加载的
- 如何理解Java是跨平台的语言
- TestDriven.NET (2.7 Beta) 支持Silverlight/CoreCLR
- 平台消息推送是如何实现的
- 如何利用.NET Core搭建跨平台的控制台应用程序
- 模块是如何加载到内核的
- java class 是如何加载的
- JSON 之FastJson解析
- 解决No Certificates are available
- 灵活的 switch
- 从一个算法题学到的
- iOS内存管理-所有权修饰符:__strong, __weak/__unsafe_unretained, __autoreleasing
- .NET跨平台之旅:corehost 是如何加载 coreclr 的 企
- Rxjava学习
- 欧拉项目 第20题 Factorial digit sum
- tag_BIGINT
- Activity recreate 后停留在onPause()状态
- 【追求进步】斐波那契数列
- 1、单目相机内参标定(camera_calibration_internal)
- C/C++—— 写一个函数,它的参数为指向函数的指针,返回类型也为指向函数的指针
- jQuery常用事件处理