改造独立部署(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,一经查实,立即删除!

相关文章

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

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

自定义路由匹配和生成

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

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

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

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

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

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

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

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

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

如何安装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;根据配置文件来路由…

基于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…

IIS中的 Asp.Net Core 和 dotnet watch

在基于传统的.NET Framework的Asp.Net Mvc的时候&#xff0c;本地开发环境中可以在IIS中建立一个站点&#xff0c;可以直接把站点的目录指向asp.net mvc的项目的根目录。然后build一下就可以在浏览器里面刷新到最新的修改了&#xff0c;也可以附加到w3wp的进程进行调试。但是在…

foreach方法使用

用法 foreach方法主要是针对数组而言的&#xff0c;对数组中的每个元素可以执行一次方法 var array [a, b, c, e]; array.forEach((a)> {console.log(a); });属性 foreach方法主要有三个参数&#xff0c;分别是数组内容、数组索引、整个数组 var array [a, b, c, e]; arra…

.NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions

.NET Core 控制台程序没有 ASP.NET Core 的 IWebHostBuilder 与 Startup.cs &#xff0c;那要读 appsettings.json、注依赖、配日志、设 IOptions 该怎么办呢&#xff1f;因为这些操作与 ASP.NET Core 无依赖&#xff0c;所以可以自己动手&#xff0c;轻松搞定。 1、读 appsett…

Object.keys方法拿到对象的key值

项目中的高级搜索选项用到了Object.keys方法&#xff0c; 那么它是用来干嘛的呢&#xff1a;删除某个子对象里的数据 var anObj { aaa: kejin,bbb: shenxian,ccc: yuanshan };let params {...anObj,ddd: luanwu } console.log(params) console.log(Object.keys(anObj)); // …

jsdiff 比较文本内容差异

翻译自 jsdiff JavaScript文本内容差异实现。 基于"An O(ND) Difference Algorithm and its Variations" (Myers, 1986) 中提出的算法 。 安装 npm install diff --save API Diff.diffChars(oldStr, newStr[, options]) -区分两个文本块&#xff0c;逐字符比较。…

Net Core下多种ORM框架特性及性能对比

在.NET Framework下有许多ORM框架&#xff0c;最著名的无外乎是Entity Framework&#xff0c;它拥有悠久的历史以及便捷的语法&#xff0c;在占有率上一路领先。但随着Dapper的出现&#xff0c;它的地位受到了威胁&#xff0c;本文对比了在.NET Core下 两种框架的表现以及与原生…

从ThoughtWorks 2017技术雷达看微软技术

ThoughtWorks在每年都会出品两期技术雷达&#xff0c;这是一份关于技术趋势的报告&#xff0c;它比起一些我们能在市面上见到的其他各种技术行情和预测报告&#xff0c;更加具体&#xff0c;更具可操作性&#xff0c;因为它不仅涉及到新技术大趋势&#xff0c;比如云平台和大数…

Spark入门(一)单主standalone安装

一、集群安装条件前置 实验spark安装在【Hadoop入门&#xff08;二&#xff09;集群安装】机器上&#xff0c; 已完成安装jdk,hadoop和ssh、网络等配置环境等。 spark所依赖的虚拟机和操作系统配置 环境&#xff1a;ubuntu14 spark-2.4.4-bin-hadoop2.6jdk1.8ssh 虚拟机&a…

AutoMapper在asp.netcore中的使用

automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具&#xff0c;不仅提高了开发的效率还使代码更加简洁&#xff0c;当然也是开源的&#xff0c;https://github.com/AutoMapper&#xff0c;这不多做介绍&#xff0c;详细看&#xff0c;官网下面是介绍它在 .net c…

Hadoop生态Zookeeper安装

一、安装条件前置 实验zookeeper安装在【Hadoop入门&#xff08;二&#xff09;集群安装】机器上&#xff0c;已完成安装jdk,hadoop和ssh配置环境等。 zookeeper所依赖的虚拟机和操作系统配置 环境&#xff1a;ubuntu14 apache-zookeeper-3.5.6-bin.tar jdk1.8ssh 虚拟机…

Hangfire在ASP.NET CORE中的简单实现

hangfire是执行后台任务的利器&#xff0c;具体请看官网介绍&#xff1a;https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNetCore hangfire的任务需要数据库持久化&#xff0c;我们在Startup类中修改ConfigureServices 然后在Configure方法中…