.NET跨平台之旅:corehost 是如何加载 coreclr 的
在前一篇博文中,在好奇心的驱使下,探秘了 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 。
开源的 .NET 变得更有意思,即使没有任何文档,即使没有正式发布,你也可以通过源码学习它,了解它。
.NET跨平台之旅:corehost 是如何加载 coreclr 的的更多相关文章
- webpack入坑之旅(五)加载vue单文件组件
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- 使用CEfSharp之旅(1) 加载网络页面
原文:使用CEfSharp之旅(1) 加载网络页面 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群里问 https://blog.csdn ...
- Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象
目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...
- .NET跨平台之旅:探秘 dotnet run 如何运行 .NET Core 应用程序
自从用 dotnet run 成功运行第一个 "Hello world" .NET Core 应用程序后,一直有个好奇心:dotnet run 究竟是如何运行一个 .NET Cor ...
- .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存
注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...
- .NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点
2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上 ...
- .NET跨平台之旅:将QPS 100左右的ASP.NET Core站点部署到Linux服务器上
今天下午我们将生产环境中一个单台服务器 QPS(每秒请求数)在100左右的 ASP.NET Core 站点部署到了 Linux 服务器上,这是我们解决了在 .NET Core 上使用 EnyimMem ...
- .NET跨平台之旅:生产环境中第2个跑在Linux上的ASP.NET Core站点
今天我们在生产环境中上线了第2个跑在Linux上的ASP.NET Core站点.这是一个简单的Web API站点,通过命令行的方式调用安装在Linux服务器上的程序完成操作.之前用的是nodejs,现 ...
- .NET跨平台之旅:在Linux上以本地机器码(native)运行ASP.NET Core站点
在将“.NET跨平台之旅”示例站点 about.cnblogs.com 从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0 (博文链接)之后,我们有一个难以抗拒的冲动 —— 体验 ...
随机推荐
- <Node入门经典>读书笔记
最近在读<Node入门经典>, 之前没有做笔记, 今天开始把看过自己又写了的代码放这里以免忘记. express var express = require('express') var ...
- IL接口和类的属性
上一篇文章学习了IL的入门,接下来我们再通过两个例子来了解下类的属性.构造函数以及接口的使用 一.类的属性.构造函数 1.先看下我们要构建的类的C#代码,然后再进行IL的实现,示例代码如下: [Ser ...
- 在Application_Error事件中获取当前的Action和Control
ASP.NET MVC程序处理异常时,方法有很多,网上也有列举了6种,下面是使用全局处理在Global.asax文件的Application_Error事件中实现.既然是ASP.NET MVC,我需要 ...
- mongo DB for C#
(1)Download the MongoDB C#驱动. http://www.nuget.org/packages/mongocsharpdriver/. (2) Add Reference to ...
- JavaWeb_day01_HTTP_Servlet
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! JavaWeb_day01 HTTP协议 HTTP(H ...
- Oracle同义词
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和试图的功能类似,就是一种映射关系.本文介绍如何创建同义词语句,删除同义词以及查看同义词语句. Oracle的同义词总结:从字面上理 ...
- hello,world!
我是马燕,在2017即将来临之际,我希望自己,在新的一年里,能开开心心,健健康康,家人平平安安! 我会努力工作,努力学习,离自己的理想越来越接近. 以后我会将我的所学所得写在这里,供未来的自己随时查看 ...
- KOTLIN开发语言文档(官方文档) -- 入门
网页链接:https://kotlinlang.org/docs/reference/basic-syntax.html 1. 入门 1.1. 基本语法 1.1.1. 定义包 包说明应该在源 ...
- 在Android中,使用Kotlin的 API请求简易方法
原文标题:API request in Android the easy way using Kotlin 原文链接:http://antonioleiva.com/api-request-kotli ...
- hideSoftInputFromWindow
有的时候会碰到软键盘不好关闭,然后就去调界面代码,发现不行,说到底还是对软键盘不熟悉的原因,软键盘windowSoftInputMode有很多种 如果你默认的activity的模式为默认的,或者sta ...