1. dotnet run 总览
当你在命令行中执行 dotnet run 时,实际上是执行了以下步骤:
dotnet进程启动(命令行工具)。- 启动应用的托管进程 (
webproject.exe或<projectname>.dll)。 - 加载 .NET Core 运行时(CoreCLR)。
- 执行应用程序代码。
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 在执行过程中需要加载以下组件:
-
.NET Core 运行时(CoreCLR):
- CoreCLR 是 .NET Core 的运行时,负责执行托管代码。
dotnet.exe不直接运行托管代码,但它需要加载和配置 CoreCLR,以便启动应用的托管进程时可以使用它。
- CoreCLR 是 .NET Core 的运行时,负责执行托管代码。
-
CoreFX 库:
dotnet.exe使用 CoreFX 来完成诸如文件操作、网络请求、内存管理等基础任务。CoreFX提供了 .NET 应用所需的基础类库,如System.IO、System.Threading等。
-
SDK 管理和依赖解析:
dotnet.exe会使用 NuGet 包管理器 来处理项目的依赖关系,确保你项目中引用的所有 NuGet 包和项目依赖都被正确解析和下载。
-
构建和发布工具:
dotnet.exe还包含了构建工具(如 MSBuild)和发布工具,这些工具会在后台运行,以确保应用被正确构建并准备好运行。
2.3 dotnet.exe 执行流程
-
解析命令行参数:
- 当执行
dotnet run时,dotnet.exe会解析命令行输入,决定当前任务是运行、构建还是测试。
- 当执行
-
加载和解析项目文件:
dotnet.exe会解析项目的.csproj(C# 项目)或.vbproj(VB 项目)文件,以识别项目的依赖项、构建设置等信息。
-
启动托管进程:
- 通过
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 托管进程加载的组件
-
CoreCLR(.NET Core 运行时):
- 当托管进程(
webproject.exe或<projectname>.dll)启动时,它会加载 CoreCLR,这是 .NET Core 的托管运行时,负责管理应用程序的生命周期(内存管理、垃圾回收、线程调度等)。 - CoreCLR 会将托管代码(例如你的 ASP.NET Core 应用代码)加载并运行。
- 当托管进程(
-
应用程序程序集:
- 通过托管进程,应用程序的入口程序集(如
Program.cs中定义的CreateHostBuilder()方法)会被加载并执行。这个过程会启动应用的 Web 服务器(例如 Kestrel)。
- 通过托管进程,应用程序的入口程序集(如
-
ASP.NET Core 框架:
-
对于 Web 应用,
webproject.exe会加载 ASP.NET Core 相关的组件和中间件:- Kestrel Web 服务器:负责接收和处理 HTTP 请求。
- Routing 中间件:负责将请求路由到正确的控制器或处理方法。
- 依赖注入(DI):将配置的服务(例如数据库上下文、身份验证服务等)注入到应用中。
-
-
CoreFX(基础类库):
webproject.exe加载 CoreFX,为应用提供常用的功能,如文件操作、网络通信、线程管理等。
-
第三方库和工具:
- 通过 NuGet 引用的第三方库会被加载,例如数据库 ORM(如 Entity Framework Core)、JSON 序列化库(如 Newtonsoft.Json)、日志记录库(如 Serilog)等。
-
配置系统:
- ASP.NET Core 提供强大的 配置系统 ,
webproject.exe会加载应用的配置文件(如appsettings.json,环境变量等),并配置依赖注入容器。
- ASP.NET Core 提供强大的 配置系统 ,
3.3 托管进程执行流程
-
应用启动:
webproject.exe加载后,首先会执行Program.cs中的CreateHostBuilder()方法,这个方法初始化应用的 Web 主机 (IWebHost),并配置 Web 服务器(如 Kestrel)以及其他中间件。
-
Web 服务器启动:
- Kestrel Web 服务器 启动并开始监听来自客户端的 HTTP 请求。
-
请求处理:
- 一旦请求到达,Kestrel 会将请求传递给应用的中间件管道,最终会到达控制器、路由、身份验证中间件等进行处理。
-
依赖注入容器:
- 在整个生命周期中,应用通过 依赖注入(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 执行流程
-
dotnet.exe解析命令:dotnet.exe解析命令行参数并决定执行什么操作。- 通过 NuGet 管理项目依赖,确保所有的依赖项和 SDK 被正确加载。
-
启动托管进程:
dotnet.exe启动webproject.exe(或<projectname>.dll)作为托管进程,负责运行应用程序代码。
-
加载 .NET 运行时:
- 托管
进程加载 CoreCLR(.NET Core 运行时),并运行应用程序代码。
-
执行应用程序:
- 启动 Web 服务器(Kestrel)并处理 HTTP 请求,通过中间件、路由和控制器处理业务逻辑。
-
加载依赖组件:
- 加载 CoreFX 库(如文件操作、网络、线程管理),以及所有 NuGet 引用的第三方库(如 Entity Framework Core、Serilog 等)。
结论
整个 dotnet run 过程涉及两个主要的进程:dotnet.exe 和托管进程(如 webproject.exe 或 <projectname>.dll )。其中,dotnet.exe 负责初始化和管理 .NET 环境,包括加载 .NET 运行时(CoreCLR)、处理构建任务、恢复依赖项等。托管进程 加载并运行实际的应用程序代码,启动 Web 服务器,并处理请求。这一系列的过程在 .NET Core 生态中形成了一个高效且灵活的执行框架。