改造独立部署(SCD)模式下.NET Core应用程序 dotnet的exe文件启动过程
設(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 ?????????????合并css和js文件的配置文件
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.vcxproj和hostfxr.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.dll和hostpolicy.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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源纯C#工控网关+组态软件(六)图元组
- 下一篇: 听云支持.NET Core的应用性能监控