日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

改造独立部署(SCD)模式下.NET Core应用程序 dotnet的exe文件启动过程

發(fā)布時間:2023/12/4 asp.net 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 改造独立部署(SCD)模式下.NET Core应用程序 dotnet的exe文件启动过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

設(shè)置一個小目標

改造前

?

改造后

?

?

獨立部署SCD模式,是指在使用dotnet publish?命令時帶上-r?參數(shù)運行時標識符(RID)。?

目標提出原因:SCD模式下文件太亂了,很多文件在開發(fā)時大多又涉及不到,發(fā)布后如果能把文件放在一個文件夾,把自己編寫的項目的文件放在根目錄,就顯得簡略多了。沒發(fā)現(xiàn)改造后的文件結(jié)構(gòu)看著舒服多么。

?

1、準備項目,并使用SCD模式發(fā)布文

mkdir apphostcd apphostdotnet new mvcdotnet builddotnet publish -c Release -r win10-x64 -o "c:\publish"


現(xiàn)在我們得到了發(fā)布后的文件,現(xiàn)在建立runtime文件夾,并把除配置文件外的文件都移過去,

??

bower.json ????????????????????bower的配置文件

bundleconfig.json ?????????????合并cssjs文件的配置文件

appsettings.json ??????????????項目運行參數(shù)文件

appsettings.Development.json ??開發(fā)模式的項目運行參數(shù)文件

apphost.runtimeconfig.json ????coreclr的配置文件

apphost.deps.json ?????????????項目程序集引用關(guān)系文件?

?

開始執(zhí)行apphost.exe

?

缺少hostfxr.dll

復(fù)制此文件過來

?

缺少hostpolicy.dll

復(fù)制此文件過來

?

看不出項目的原因吧,這是需要開始Trace,在系統(tǒng)環(huán)境變量添加新的系統(tǒng)變量COREHOST_TRACE?值設(shè)置為1

再次執(zhí)行后

?

?

怎么辦,無路可走了,把錯誤命令在github上搜索上,看有結(jié)果沒

?

https://github.com/dotnet/core-setup

下載源碼,調(diào)試下程序,看問題出在哪里

這里使用2.0.0版本的源碼?

https://github.com/dotnet/core-setup/blob/master/Documentation/building/windows-instructions.md

準備環(huán)境

win8.1系統(tǒng)(硬盤至少50G,不然會不夠用的)

Visual Studio 2015 Update 3

CMake

Git

PowerShell

DotNet Core SDK

?

以上是文檔說的

但是還需要準備一個?dotnet-dev-win-x64.1.0.0-rc4-004771.zip

編譯的時候,需要會提示需要這個版本的sdk,不然編譯通不過

?

環(huán)境準備好,就可以執(zhí)行build.cmd了,等著吧編譯時間很長

?

編譯完成后,可以在\Bin\obj\win-x64.Debug\corehost\cli\exe\apphost目錄找到 ?apphost.vcxproj

?

vs2015打開

?

并把?Bin\obj\win-x64.Debug\corehost\cli\dll\hostpolicy.vcxproj

Bin\obj\win-x64.Debug\corehost\cli\dll\hostfxr.vcxproj

加入到apphost.sln解決方案中

然后改動?hostpolicy.vcxprojhostfxr.vcxproj的輸出目錄到

Bin\obj\win-x64.Debug\corehost\cli\exe\apphost\Debug

?

然后把上面改動發(fā)布的文件publish里的文件全部復(fù)制到

Bin\obj\win-x64.Debug\corehost\cli\exe\apphost\Debug文件

編譯下項目,就可以開始調(diào)試了

?

我們來整理下?apphost.exe的加載邏輯

?

corehost.app入口在這里,可以一直F11下去,直到啟動coreclr?

?

apphost.exe?主要功能是檢查文件是否合法

corehost.app main()入口

??run()?檢查執(zhí)行路徑

????is_exe_enabled_for_execution()?檢查是不是又dotnet build?編譯的文件,dotnet build編譯的時候會嵌入exe文件中一個?dll文件名的hash值,因為我們是調(diào)試生成的exe文件,所以肯定通不過hash值的檢查的,所以我們把corehost.app文件的第147行的?return StatusCode::AppHostExeNotBoundFailure;?注釋掉

????下面就是加載?hostfxr.dll文件

?

源碼邏輯驗證了上面移動文件的錯誤提示信息

?

hostfxr.dll ?讀取runtimeconfig.json文件

hostfxr.cpp hostfxr_main()是入口

????muxer.execute()

????????detect_operating_mode() libhost.app ?判斷執(zhí)行coreclr的模式 ?host_mode_t?

?

?invalid = 0, ? ?

????muxer, ?????????// Invoked as "dotnet.exe". ? ?

????standalone, ????// Invoked as "appname.exe" from the application base: either "standalone" or "branded". When implementing branded exes, rename this to "apphost"

?

????split_fx ???????// Invoked as "corehost.exe" for xunit scenarios -- this has to be fixed by the CLI to not use this executable and this mode should not be supported.

????????????????????// Split FX means, the host is operating like "corerun.exe" in a split location from the application base (CORE_ROOT equivalent), but it has its "hostfxr.dll"

????????????????????// next to it.

?

????執(zhí)行?standalone?模式?

????parse_args_and_execute() ?fx_muxer.cpp ???找到runtimeconfig文件?

????read_config_and_execute ?fx_muxer.cpp ????找到并讀取文件

???????????get_runtime_config_paths_from_app ?libhost.app?找到文件

????????????config() ?runtime_config.app ??????格式化文件

??????????????ensure_parsed ??runtime_config.app?

??execute_app()?執(zhí)行hostpolicy.dll?

hostpolicy.dll?讀取deps.json文件?

corehost_main ???hostpolicy.app?入口?

??deps_resolver_t()?格式化deps.json文件? ??

????load() deps_format.cpp?讀取deps.json文件?

????resolve_probe_paths() ?deps_resolver.cpp ??

???????to_dir_path() ?deps_enty.cpp ?檢查文件是否存在?

??啟動coreclr.dll?

到這里就可以?找到了?to_path()方法來判斷文件是否存在,修改to_dir_path()方法來實現(xiàn)修改如下?

但是因為asp net core?使用了DI,還需要修改?Microsoft.Extensions.DependencyModel.dll不然還是會報著不到文件?

最后可以找到?TryResolveAssemblyPaths() AppBaseCompilationAssemblyResolver.cs

?

修改如下,?

經(jīng)過上面的分析,發(fā)布后,只需要替換Microsoft.Extensions.DependencyModel.dllhostpolicy.dll?兩個文件就實現(xiàn)了目標?

?可調(diào)試文件源碼

https://github.com/xakepbean/core-setup-debug

原文:http://www.cnblogs.com/xakep/articles/7751273.html


.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的改造独立部署(SCD)模式下.NET Core应用程序 dotnet的exe文件启动过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。