.NET10之从进程角度理解dotnet run

1. dotnet run 总览

当你在命令行中执行 dotnet run 时,实际上是执行了以下步骤:

  1. dotnet 进程启动(命令行工具)。
  2. 启动应用的托管进程 (webproject.exe 或 <projectname>.dll)。
  3. 加载 .NET Core 运行时(CoreCLR)。
  4. 执行应用程序代码。

2. dotnet.exe 启动过程分析

2.1 dotnet.exe 的角色

dotnet.exe 是 .NET Core 和 .NET 5+ 环境的核心命令行工具。它不仅提供了构建、发布和测试等功能,还负责启动你的应用程序(如 ASP.NET Core 或控制台应用)。

  • 命令行工具 :dotnet.exe 解析命令行参数并根据给定的命令(如 run, build, publish 等)执行不同的操作。
  • 项目依赖管理 :dotnet.exe 会确保应用程序所依赖的所有 NuGet 包和项目引用都已经被正确还原和管理。
  • 启动托管进程 :当执行 dotnet run 时,dotnet.exe 会启动应用的托管进程,通常是 webproject.exe (Windows)或 <projectname>.dll(Linux/macOS),这些进程最终会加载 .NET Core 运行时并执行应用程序代码。
2.2 dotnet.exe 加载的组件

dotnet.exe 在执行过程中需要加载以下组件:

  1. .NET Core 运行时(CoreCLR):

    • CoreCLR 是 .NET Core 的运行时,负责执行托管代码。dotnet.exe 不直接运行托管代码,但它需要加载和配置 CoreCLR,以便启动应用的托管进程时可以使用它。
  2. CoreFX 库:

    • dotnet.exe 使用 CoreFX 来完成诸如文件操作、网络请求、内存管理等基础任务。CoreFX 提供了 .NET 应用所需的基础类库,如 System.IO、System.Threading 等。
  3. SDK 管理和依赖解析:

    • dotnet.exe 会使用 NuGet 包管理器 来处理项目的依赖关系,确保你项目中引用的所有 NuGet 包和项目依赖都被正确解析和下载。
  4. 构建和发布工具:

    • dotnet.exe 还包含了构建工具(如 MSBuild)和发布工具,这些工具会在后台运行,以确保应用被正确构建并准备好运行。
2.3 dotnet.exe 执行流程
  1. 解析命令行参数:

    • 当执行 dotnet run 时,dotnet.exe 会解析命令行输入,决定当前任务是运行、构建还是测试。
  2. 加载和解析项目文件:

    • dotnet.exe 会解析项目的 .csproj(C# 项目)或 .vbproj(VB 项目)文件,以识别项目的依赖项、构建设置等信息。
  3. 启动托管进程:

    • 通过 dotnet run,dotnet.exe 会启动应用的 托管进程 ,即通过 dotnet <projectname>.dll 或 webproject.exe 启动应用程序。

3. 托管进程启动:webproject.exe 或 <projectname>.dll

3.1 托管进程的角色
  • 当你运行 dotnet run 时,dotnet.exe 启动一个托管进程,这个进程实际执行应用程序的代码。
  • 对于 ASP.NET Core 应用,这个托管进程通常是 webproject.exe(Windows)或 <projectname>.dll(Linux/macOS)。无论是哪种情况,这些进程的目标是加载并启动 .NET Core 运行时。
3.2 托管进程加载的组件
  1. CoreCLR(.NET Core 运行时):

    • 当托管进程(webproject.exe 或 <projectname>.dll)启动时,它会加载 CoreCLR,这是 .NET Core 的托管运行时,负责管理应用程序的生命周期(内存管理、垃圾回收、线程调度等)。
    • CoreCLR 会将托管代码(例如你的 ASP.NET Core 应用代码)加载并运行。
  2. 应用程序程序集:

    • 通过托管进程,应用程序的入口程序集(如 Program.cs 中定义的 CreateHostBuilder() 方法)会被加载并执行。这个过程会启动应用的 Web 服务器(例如 Kestrel)。
  3. ASP.NET Core 框架:

    • 对于 Web 应用,webproject.exe 会加载 ASP.NET Core 相关的组件和中间件:

      • Kestrel Web 服务器:负责接收和处理 HTTP 请求。
      • Routing 中间件:负责将请求路由到正确的控制器或处理方法。
      • 依赖注入(DI):将配置的服务(例如数据库上下文、身份验证服务等)注入到应用中。
  4. CoreFX(基础类库):

    • webproject.exe 加载 CoreFX,为应用提供常用的功能,如文件操作、网络通信、线程管理等。
  5. 第三方库和工具:

    • 通过 NuGet 引用的第三方库会被加载,例如数据库 ORM(如 Entity Framework Core)、JSON 序列化库(如 Newtonsoft.Json)、日志记录库(如 Serilog)等。
  6. 配置系统:

    • ASP.NET Core 提供强大的 配置系统 ,webproject.exe 会加载应用的配置文件(如 appsettings.json,环境变量等),并配置依赖注入容器。
3.3 托管进程执行流程
  1. 应用启动:

    • webproject.exe 加载后,首先会执行 Program.cs 中的 CreateHostBuilder() 方法,这个方法初始化应用的 Web 主机 (IWebHost),并配置 Web 服务器(如 Kestrel)以及其他中间件。
  2. Web 服务器启动:

    • Kestrel Web 服务器 启动并开始监听来自客户端的 HTTP 请求。
  3. 请求处理:

    • 一旦请求到达,Kestrel 会将请求传递给应用的中间件管道,最终会到达控制器、路由、身份验证中间件等进行处理。
  4. 依赖注入容器:

    • 在整个生命周期中,应用通过 依赖注入(DI)容器 获取服务和组件(例如数据库上下文、缓存、日志记录服务等)。

4. 进程之间的关系

  • dotnet.exe:

    • 作为命令行工具,dotnet.exe 负责初始化并启动托管进程。它加载和配置了 .NET 运行时(CoreCLR),并启动了应用程序所需的其他工具和依赖项(如 NuGet 包管理器、SDK 工具、构建工具等)。
  • 托管进程(webproject.exe 或 <projectname>.dll):

    • 这是实际运行应用程序代码的进程。它加载并运行应用的托管代码,并启动 Web 服务器(如 Kestrel)处理 HTTP 请求。
  • CoreCLR:

    • 无论是 dotnet.exe 还是托管进程,都会加载 CoreCLR,它是 .NET Core 运行时,负责托管代码的执行、内存管理、垃圾回收、线程管理等。

5. 总结:dotnet run 执行流程

  1. dotnet.exe 解析命令:

    • dotnet.exe 解析命令行参数并决定执行什么操作。
    • 通过 NuGet 管理项目依赖,确保所有的依赖项和 SDK 被正确加载。
  2. 启动托管进程:

    • dotnet.exe 启动 webproject.exe(或 <projectname>.dll)作为托管进程,负责运行应用程序代码。
  3. 加载 .NET 运行时:

    • 托管

进程加载 CoreCLR(.NET Core 运行时),并运行应用程序代码。

  1. 执行应用程序:

    • 启动 Web 服务器(Kestrel)并处理 HTTP 请求,通过中间件、路由和控制器处理业务逻辑。
  2. 加载依赖组件:

    • 加载 CoreFX 库(如文件操作、网络、线程管理),以及所有 NuGet 引用的第三方库(如 Entity Framework Core、Serilog 等)。

结论

整个 dotnet run 过程涉及两个主要的进程:dotnet.exe 和托管进程(如 webproject.exe 或 <projectname>.dll )。其中,dotnet.exe 负责初始化和管理 .NET 环境,包括加载 .NET 运行时(CoreCLR)、处理构建任务、恢复依赖项等。托管进程 加载并运行实际的应用程序代码,启动 Web 服务器,并处理请求。这一系列的过程在 .NET Core 生态中形成了一个高效且灵活的执行框架。

相关推荐
波力海苔夹心脆6756 小时前
C# 视觉检测实战:PLC 按钮触发 VisionPro 检测,OK 亮灯 / NG 灭灯(西门子 PLC,含界面显示与图片存档)
开发语言·经验分享·c#·自动化·视觉检测·.net
hez20108 小时前
一行代码在 .NET 项目里启用 Satori GC
c#·.net·.net core·gc·clr
QUDONG_biubiubiu11 小时前
.NET Runtime 6.0/7.0/8.0/9.0下载修复教程,软件打不开这样解决
.net·net runtime下载·net运行库修复·net runtime安装
宝桥南山12 小时前
.NET 11 - 尝试创建一下AGUIServer和AGUIClient(基于新版.NET SDK for AG-UI)
microsoft·ai·微软·c#·aigc·.net
波力海苔夹心脆67512 小时前
C# LINQ 入门到上手:一篇讲透查询语法、常用操作符与延迟执行(含示例与速查表
经验分享·c#·.net·solr·linq
小羊没烦恼!1 天前
Windows Azure Platform体验(1):Windows Azure
java·大数据·后端·python·flask·word·.net
CSharp精选营2 天前
IIS 后面挂 Kestrel,这 3 个配置错了就 502
kestrel·.net·iis配置
鑫 源2 天前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin
xiangcns4 天前
PDMS PiplineTool(三十)一堆小优化+一个彩蛋功能
.net·二次开发·pdms