.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.IOSystem.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 rundotnet.exe 会启动应用的 托管进程 ,即通过 dotnet <projectname>.dllwebproject.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 生态中形成了一个高效且灵活的执行框架。

相关推荐
缺点内向2 天前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
2501_930707782 天前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
向上的车轮2 天前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
波波0072 天前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
波波0073 天前
每日一题:中间件是如何工作的?
中间件·.net·面试题
无风听海3 天前
.NET 10之可空引用类型
数据结构·.net
码云数智-园园3 天前
基于 JSON 配置的 .NET 桌面应用自动更新实现指南
.net
无风听海3 天前
.NET 10 之dotnet run的功能
.net
岩屿3 天前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net