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

设置一个小目标

改造前

 

改造后

 

 

独立部署SCD模式,是指在使用dotnet publish 命令时带上-r 参数运行时标识符(RID)。 

目标提出原因:SCD模式下文件太乱了,很多文件在开发时大多又涉及不到,发布后如果能把文件放在一个文件夹,把自己编写的项目的文件放在根目录,就显得简略多了。没发现改造后的文件结构看着舒服多么。

 

1、准备项目,并使用SCD模式发布文

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


现在我们得到了发布后的文件,现在建立runtime文件夹,并把除配置文件外的文件都移过去,

  

bower.json                     bower的配置文件

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

appsettings.json               项目运行参数文件

appsettings.Development.json   开发模式的项目运行参数文件

apphost.runtimeconfig.json     coreclr的配置文件

apphost.deps.json              项目程序集引用关系文件 

 

开始执行apphost.exe

 

缺少hostfxr.dll

复制此文件过来

 

缺少hostpolicy.dll

复制此文件过来

 

看不出项目的原因吧,这是需要开始Trace,在系统环境变量添加新的系统变量COREHOST_TRACE 值设置为1

再次执行后

 

 

怎么办,无路可走了,把错误命令在github上搜索上,看有结果没

 

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

下载源码,调试下程序,看问题出在哪里

这里使用2.0.0版本的源码 

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

准备环境

win8.1系统(硬盘至少50G,不然会不够用的)

Visual Studio 2015 Update 3

CMake

Git

PowerShell

DotNet Core SDK

 

以上是文档说的

但是还需要准备一个 dotnet-dev-win-x64.1.0.0-rc4-004771.zip

编译的时候,需要会提示需要这个版本的sdk,不然编译通不过

 

环境准备好,就可以执行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

 

然后把上面改动发布的文件publish里的文件全部复制到

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

编译下项目,就可以开始调试了

 

我们来整理下 apphost.exe的加载逻辑

 

corehost.app入口在这里,可以一直F11下去,直到启动coreclr 

 

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

corehost.app main()入口

  run() 检查执行路径

    is_exe_enabled_for_execution() 检查是不是又dotnet build 编译的文件,dotnet build编译的时候会嵌入exe文件中一个 dll文件名的hash值,因为我们是调试生成的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  判断执行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.

 

    执行 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() 执行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()方法来实现修改如下 

但是因为asp net core 使用了DI,还需要修改 Microsoft.Extensions.DependencyModel.dll不然还是会报着不到文件 

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

 

修改如下, 

经过上面的分析,发布后,只需要替换Microsoft.Extensions.DependencyModel.dllhostpolicy.dll 两个文件就实现了目标 

 可调试文件源码

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

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


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1268-树的重量【图论】

正题 题目大意 一棵树有nnn个叶子节点,给出每两个叶子节点之间的距离。求这棵树的边权之和。 解题思路 我们考虑每次加入一个节点。两个节点时不用说。 加入第三个节点时,肯定是加入在节点1和节点2之间。 之后我们开始推导:当我们加入节点…

mybatis源码阅读(四):mapper(dao)实例化

转载自 mybatis源码阅读(四):mapper(dao)实例化 在开始分析之前,先来了解一下这个模块中的核心组件之间的关系,如图: 1.MapperRegistry&MapperProxyFactory MapperRegistry是Mapper接口及其对应的代理对象工程的注册中心&…

ajax的封装使用

面试的时候有人问到我ajax的使用,当时回答的不算好,这里想重新总结下: 1、如何将配置等信息传到ajax函数里面去 这个采用的是在参数里加一个对象,对象里面放入字段,然后在ajax里设置一个option,通过option…

P3385-[模板]负环【SPFA】

正题 题目大意 求点1可不可以走到负环。 解题思路 用cnticnt_icnti​表示到iii的最短路经过了多少个点&#xff0c;然后求若cnti≥ncnt_i\geq ncnti​≥n且这条路是负数那么就有负环。 codecodecode #include<cstdio> #include<queue> #include<cstring> …

自定义路由匹配和生成

前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用&#xff1a; 《ASP.NET Core 中的SEO优化&#xff08;1&#xff09;&#xff1a;中间件实现服务端静态化缓存》 《ASP.NET Core 中的SEO优化&#xff08;2&#xff09;&#xff1a;中间件中渲染Razor视图》…

mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法

转载自 mybatis多个参数(不使用param注解情况下)&#xff0c;sql参数占位符正确写法 useActualParamName配置 useActualParamName允许使用方法签名中的名称作为语句参数名称。 为了使用该特性&#xff0c;你的工程必须采用Java 8编译&#xff0c;并且加上-parameters选项。&…

如何封装并发布一个属于自己的ui组件库

以前就一直有个想法自己能不能封装一个类似于elementui一样的组件库&#xff0c;然后发布到npm上去&#xff0c;毕竟前端说白了&#xff0c;将组件v上去&#xff0c;然后进行数据交互。借助这次端午&#xff0c;终于有机会&#xff0c;尝试自己去封装发布组件库了 我这里了只做…

P1768-天路【负环,SPFA,01分数规划,二分答案】

正题 题目链接:https://www.luogu.org/problemnew/show/P1768 题目大意 求一条回路使得路上∑vi∑pi\frac{\sum v_i}{\sum p_i}∑pi​∑vi​​最大。 解题思路 考虑01分数规划 ∑vi∑pians\frac{\sum v_i}{\sum p_i}ans∑pi​∑vi​​ans ∑vians∗∑pi\sum v_ians*\sum p_i…

听云支持.NET Core的应用性能监控

随着微软于2017年8月正式发布.NET Core 2.0&#xff0c; .NET Core 社区开始活跃&#xff0c;众多.NET开发者开始向跨平台转变。 听云于2017年11月推出了.NET Core应用监控工具&#xff0c;和听云其他语言的监控工具一样&#xff0c;.NET Core应用监控工具具有以下特征&#xf…

mybatis源码阅读(五) ---执行器Executor

转载自 mybatis源码阅读(五) ---执行器Executor 1. Executor接口设计与类结构图 public interface Executor {ResultHandler NO_RESULT_HANDLER null;// 执行update&#xff0c;delete&#xff0c;insert三种类型的sql语句int update(MappedStatement ms, Object parameter…

.sync的一个用法

面试时&#xff0c;有人问了我修饰符是什么&#xff0c;就是一个点后面加一个单词&#xff0c;我当时还以为是什么文件夹后缀呢。很是尴尬 这里主要学习下.sync的一个用法 假设下场景&#xff1a; 这里有一个父组件&#xff0c;父组件中有个money&#xff0c;需要传到子组件中…

nssl1296-猫咪的进化【dp】

正题 题目大意 nnn次&#xff0c;每次有3种选择&#xff1a; 休息获得viv_ivi​点价值获得vi2v_i^2vi2​点价值且下一回合要休息 解题思路 定义fi,0/1/2f_{i,0/1/2}fi,0/1/2​表示第iii次为休息/叫一声/叫两声时的最大价值。 fi,0f_{i,0}fi,0​可以由前面任何状态转移过来。 …

[52ABP实战系列] .NET CORE实战入门第三章更新了

早安 各位道友好&#xff0c;.NET CORE入门视频的第三章也算录制完毕了。欢迎大家上传课网进行学习。 更新速度 大家也知道最近的社会新闻比较多。频繁发生404、关键字打不出来&#xff0c;我个人也在关注这些事件。导致精力分散&#xff0c;没有做到稳定更新&#xff0c;现在呢…

如何安装nuxt

因为vue是单页面应用&#xff0c;所以不被Seo&#xff0c;如百度和Google抓取到&#xff0c;在Vue中如果想要爬虫爬到就必须使用nuxt 那么如何安装使用呢&#xff1f; yarn create nuxt-app <project-name> cd <project-name> yarn build yarn start必须先build&a…

mybatis源码阅读(六) ---StatementHandler了解一下

转载自 mybatis源码阅读(六) ---StatementHandler了解一下 StatementHandler类结构图与接口设计 BaseStatementHandler&#xff1a;一个抽象类&#xff0c;只是实现了一些不涉及具体操作的方法 RoutingStatementHandler&#xff1a;类似路由器&#xff0c;根据配置文件来路由…

nssl1298-网站计划【线段树】

正题 题目大意 若干个区间操作l,rl,rl,r 让答案增加(lr)∗max{ai}(i∈[l..r])(lr)*max\{a_i\}(i\in[l..r])(lr)∗max{ai​}(i∈[l..r]) 并把最大的数变为0 解题思路 线段树&#xff0c;上传最大值时多上传一个位置&#xff0c;然后单点修改。 codecodecode #include<cstd…

输入框限定保留三位小数点

这里用到正则表达式&#xff0c;没输入一个数字会对输入框进行一次事件的触发&#xff0c;检查是否超过三位小数点&#xff0c;超过则进行删除。 你可以3改成2&#xff0c;这样就是保留两位小数点了 <el-input placeholder"请输入商品重量" v-model"baseInfo…

基于OIDC(OpenID Connect)的SSO(纯JS客户端)

在上一篇基于OIDC的SSO的中涉及到了4个Web站点&#xff1a; oidc-server.dev&#xff1a;利用oidc实现的统一认证和授权中心&#xff0c;SSO站点。 oidc-client-hybrid.dev&#xff1a;oidc的一个客户端&#xff0c;采用hybrid模式。 oidc-client-implicit.dev&#xff1a;od…

mybatis源码阅读(七) ---ResultSetHandler了解一下

转载自 mybatis源码阅读(七) ---ResultSetHandler了解一下 1、MetaObject MetaObject用于反射创建对象、反射从对象中获取属性值、反射给对象设置属性值&#xff0c;参数设置和结果封装&#xff0c;用的都是这个MetaObject提供的功能。 public static MetaObject forObject…

nssl1299-选做作业【最大流,最小割,最大子权闭合图】

正题 题目大意 有nnn个任务&#xff0c;完成需要先决条件&#xff0c;然后有完成价值。选择一些任务完成&#xff0c;求最大价值。 解题思路 首先&#xff0c;如果有环&#xff0c;那么这些环是不可能完成的。所以先用拓扑排序找环。 然后考虑最大子权闭合图&#xff0c;对于…