溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

corehost是怎么加載coreclr的

發(fā)布時(shí)間:2021-12-21 17:03:27 來(lái)源:億速云 閱讀:102 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹corehost是怎么加載coreclr的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

在 探秘 dotnet run 如何運(yùn)行 .NET Core 應(yīng)用程序 中,在好奇心的驅(qū)使下,探秘了 dotnet run ,發(fā)現(xiàn)了神秘的 corehost  —— 運(yùn)行 .NET Core 應(yīng)用程序的幕后英雄。有時(shí)神秘就是一種誘惑,神秘的 corehost 讓人產(chǎn)生了新的好奇心 —— corehost 是如何加載 coreclr 的?于是,“.NET跨平臺(tái)之旅”開啟了新的旅程 —— 帶著這個(gè)疑問(wèn),游覽cli/src/corehost/ 。

corehost 的入口是 corehost.cpp 的 main() ,進(jìn)來(lái)后一條大道通向 corehost.run() 。

在 corehost.run() 中,首先調(diào)用的是 libhost.cpp 中的 detect_operating_mode() ,它根據(jù) coreclr 所在的路徑?jīng)Q定 corehost 的運(yùn)行模式,有三種運(yùn)行模式:muxer, standalone, split-fx。如果 corehost 與 coreclr 不在同一個(gè)文件夾,運(yùn)行模式則是 muxer 。如果 corehost 與 coreclr 在同一個(gè)文件夾,并且文件夾下存在 .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 默認(rèn)使用的模式是 split-fx 模式,我們的示例站點(diǎn) about.cnblogs.com 用的也是這種模式,通過(guò)下面的 tracing 信息可以看出來(lái)(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 模式”這條游覽路線。

針對(duì) split-fx 模式,corehost.run() 接著會(huì)調(diào)用 hostpolicy.cpp 的 run() 方法(通過(guò) corehost_init_t ),run() 方法中調(diào)用 deps_resolver.cpp 的resolve_coreclr_dir() 解析 coreclr 所在的路徑,然后調(diào)用 coreclr.cpp 的 bind() 與 initialize() 方法加載 coreclr 。

在 bind() 方法中,根據(jù)之前解析出的 coreclr 路徑,調(diào)用 pal.unix.cpp(針對(duì)的是Linux運(yùn)行環(huán)境)的 load_library() 打開 coreclr 的庫(kù)文件 libcoreclr.so (實(shí)際是調(diào)用 Linux 的 C 函數(shù) dlopen() ),從而得到 coreclr 中3個(gè)函數(shù)(coreclr_initialize, coreclr_shutdown,coreclr_execute_assembly)的句柄。

在 initialize() 方法中,根據(jù) bind() 中得到的句柄調(diào)用 coreclr 的 coreclr_initialize() 方法啟動(dòng) coreclr , 加載 coreclr 的工作就這樣完成了。

找到 coreclr 庫(kù)文件所在的位置,打開它,調(diào)用它的 coreclr_initialize() 方法,corehost 加載 coreclr 就這么簡(jiǎn)單。如果你有興趣,可以用 C++ 寫一個(gè)自己的 corehost 。

關(guān)于corehost是怎么加載coreclr的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI