• .NET KRuntime 程序加载流程(coreCLR)


    (本人纯属个人见解)

    STEP 1

    K.cmd paramlist

     

    paramlist={

      -AppBase

      -Lib

      Command

    }

     

    if  Command like k-*

      Call k-*.cmd

    else

      Let paramlist= Microsoft.Framework.ApplicationHost + paramlist

      Call KLR.exe paramlist

    endif

     

    总结:准备参数,并启动KLR进程,paramlist在每次跨模块调用时都会传递

    STEP 2

     

    KLR.exe(native)

     

    if  CORECLR 

      Call CallApplicationMain[klr.core45.dll] 

    else

      Call CallApplicationMain[klr.net45.dll]

    endif

     

    总结:根据不同的CLR,创建不同的运行环境

    STEP 3

    klr.core45.dll(native)

     

    1.加载coreclr.dll(native)

     

    2.加载并启动CLRRuntimeHost

      Let CLRRuntimeHost = Call GetCLRRuntimeHost[coreclr.dll]

      Call CLRRuntimeHost.Start

     

    3.创建AppDomain

     

      Call CLRRuntimeHost.CreateAppDomainWithManager

     

    4.Call DomainManager.Execute[klr.core45.managed.dll]

     

    总结:创建.net必须的可以执行托管代码的运行时环境

    STEP 4

    klr.core45.managed(managed)

     

    Call RuntimeBootstrapper.Execute[klr.hosting.shared.dll(managed)]

     

    Call Bootstrapper.Main[klr.host.dll]

     

    提取 paramlist第一个参数( Microsoft.Framework.ApplicationHost )

     

    Let  paramlist= paramlist - paramlist[0]

     

    Call Program.Main[Microsoft.Framework.ApplicationHost]

     

    总结:根据参数,创建一个托管代码程序的宿主,宿主就是负责以什么规则去加载和运行托管程序,这里Microsoft.Framework.ApplicationHost是一个参数,可以自己实现一个,也就是说一个程序的物理结构是啥样,你自己决定了。

    STEP 5

    Microsoft.Framework.ApplicationHost(managed)

     

    1.创建DefaultHost

      1.读取project.json配置文件

      2.解析项目依赖项(包括Reference Assemblies、GAC Assemblies、NuGet Packages)并加载

     

    2.确定程序入口ApplicationName

      {ApplicationName}默认是应用程序的目录(比如ConsoleApp1)

      {programArgs}默认是paramlist剩下的数据

      提取paramlist.command:

      比如run或者web

      如果project.json的commands项中存在此命令,{ApplicationName}等于其值的第一个 参数,{programArgs}就是剩下的值

      下面是个配置command demo

      "web": "Microsoft.AspNet.Hosting 

        --server Microsoft.AspNet.Server.WebListener 

        --server.urls http://localhost:5000"

     

    3.加载 {ApplicationName}.dll并调用Program.Main(programArgs)

      如果是ConsoleApp,调用Program.Main,程序开始

      如果是Web App,则调用Program.Main[Microsoft.AspNet.Hosting]

     

    总结:.Net vNext程序的必须配置信息都存储在project.json中,这里就是围绕着这些配置信息从各种程序源去加载依赖项;

    还有程序入口你可以指定,通过project.json配置,只要求你的程序包括Program.Main程序入口,也就是ConsoleApp必须包括Program.Main;

    Console App与Web App的加载区别就是ConsoleApp自己提供了Program.Main,Web App的入口是Microsoft.AspNet.HostingProgram.Main,然后它再来负责运行的web.

  • 相关阅读:
    解决mysqldump: Got error: 1044: Access denied for user
    Ubuntu技巧之 is not in the sudoers file解决方法
    mysql日志详细解析
    linux利用grep查看打印匹配的下几行或前后几行的命令
    Linux无法使用userdel删除用户和组的解决办法
    ubuntu快速清理磁盘垃圾
    smarty中math函数的用法
    metinfo首页内容简介
    linux命令别名的使用
    mysql 导出表结构和表数据 mysqldump用法
  • 原文地址:https://www.cnblogs.com/ykai/p/3817120.html
Copyright © 2020-2023  润新知