编程博客
002、修改Nuget包位置
001、C#常用的单词
003、收藏的书签
回家准备
004、ASP.NET Core 3.0 gRPC
001、ASP.NET Core 3.0 使用gRPC
002、ASP.NET Core 3.0 gRPC 双向流
003、ASP.NET Core 3.0 gRPC 身份认证和授权
005、飞牛NAS
001、 FnOS飞牛系统实用配置1-应用远程访问(迅雷)
006、DeepSeek
001、DeepSeek 使用指南
007、并发编程
01、并发编程 - 死锁的产生、排查与解决方案
02、并发编程 - 初识线程
03、并发编程 - 线程浅试
04、并发编程 - 线程同步(一)
05、并发编程 - 线程同步(二)
06、并发编程 - 线程同步(三)之原子操作 Interlocked 简介
07、并发编程 - 线程同步(四)之原子操作 Interlocked 详解一
08、并发编程 - 线程同步(五)之原子操作 Interlocked 详解二
09、并发编程 - 线程同步(六)之锁 lock
008、启动项
03、应用--Program 中的 WebApplication
02、主机--Host
01、Program 文件的作用
04、控制反转 IOC 与依赖注入 DI
05、中间件
06、Logger 原理及配置 Log4Net
07、ElasticSearch
本文档使用 MrDoc 发布
-
+
首页
01、Program 文件的作用
# Program.cs 文件分析 Program.cs 文件是至关重要的一个文件,它包含应用程序启动的代码,还可以配置所需要的服务和应用管道的中间件。 **需要掌握:** * [ ] 6.0 版本前后生成的 Program.cs 文件的区别 * [ ] Program.cs 文件的作用 * [ ] Startup.cs 文件的作用 ## 版本注意:[#](https://www.cnblogs.com/boise/p/17700124.html#%E7%89%88%E6%9C%AC%E6%B3%A8%E6%84%8F) ### 在 6.0 版本之前(不含 6.0)[#](https://www.cnblogs.com/boise/p/17700124.html#%E5%9C%A860%E7%89%88%E6%9C%AC%E4%B9%8B%E5%89%8D%E4%B8%8D%E5%90%AB60) 6.0 版本之前,在使用 VS 创建 Web 应用程序框架时,会生成 **Program.cs** 和\*\*Startup.cs \*\*2 个类文件 #### Program.cs:[#](https://www.cnblogs.com/boise/p/17700124.html#programcs) 用于创建和运行主机。 该类包含 2 个方法: * **一个 Main 方法**:是整个应用的入口方法,调用构建主机的静态方法,然后构建并运行。 * **一个静态的构建主机的方法**:用于配置主机服务,在 3.0 版本之前使用 CreateWebHostBuilder()的方法用于构建 WebHost,3.0 至 5.0 版本使用 CreateHostBuilder()构建通用主机 Host。2 个方法的区别以及 WebHost 和 Host 的区别请参考**[主机]()**。 *2.1 版本* ```C# public class Program { public static void Main(string[] args) { // 获取并创建主机实例并运行起来 CreateWebHostBuilder(args).Build().Run(); } /// <summary> /// 生成Web应用主机 /// </summary> /// <param name="args"></param> /// <returns></returns> public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) // 反射调用Startup类 .UseStartup<Startup>() // 使用Kestrel作为服务器并集成到IIS .UseKestrel() .UseIISIntegration() ); } ``` *3.1 版本* ```C# public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } /// <summary> /// 生成通用主机 /// </summary> /// <param name="args"></param> /// <returns></returns> public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 虽然使用的是Host主机,但是同样也要配置WebHost,原因是需要告知web的默认配置 // 大白话就是,需要告诉主机,你的web应用需要那些配置服务,就是指向Startup文件 // 用于托管Web应用程序的默认值配置 .ConfigureWebHostDefaults(Builder => { Builder.UseStartup<Startup>(); }); } ``` #### StartUp.cs 类:[#](https://www.cnblogs.com/boise/p/17700124.html#startupcs-%E7%B1%BB) 用于配置主机启动的时候,所需要的服务以及管道中间件。包含 3 个方法 * **一个构造函数**:可以提供一些属性给 ConfigureServices()和 Configure()使用 * **一个 ConfigureServices()方法**:返回 IServiceProvider 的用于配置主机所需要的服务。 * **一个无返回值的 Configure()方法**:用于配置管道中间件。 ### 6.0 及以后版本(目前是 7.0)[#](https://www.cnblogs.com/boise/p/17700124.html#60%E5%8F%8A%E4%BB%A5%E5%90%8E%E7%89%88%E6%9C%AC%E7%9B%AE%E5%89%8D%E6%98%AF70) 6.0 版本之后,微软使用最小托管模型来生成应用,使用最小托管模型仅仅 4 句代码就能创造一个 NetCore 应用 #### **特点:**[#](https://www.cnblogs.com/boise/p/17700124.html#%E7%89%B9%E7%82%B9) * Program.cs 和 Startup.cs 文件一起合并到 Program.cs 文件中(至于为什么这么做,微软给出的解释是为了降低学习成本) * Startup.cs 中 Configure()和 ConfigureServices()方法不再使用,当然 6.0 版本是向下兼容的,所以还是可以使用 Startup.cs 文件来配置服务的。 * 使用顶级语句最大程度减少应用代码 * 使用全局 using 语句 #### 最小托管模型:[#](https://www.cnblogs.com/boise/p/17700124.html#%E6%9C%80%E5%B0%8F%E6%89%98%E7%AE%A1%E6%A8%A1%E5%9E%8B) 请参考[官方文档](https://learn.microsoft.com/zh-cn/aspnet/core/migration/50-to-60?view=aspnetcore-7.0&tabs=visual-studio#am6) ```C# // 得到应用构造器:WebApplicationBuilder var builder = WebApplication.CreateBuilder(args); // 配置日志 builder.Logging.AddLog4Net("ConfigFile/log4net.config"); // 得到应用:WebApplication var app = builder.Build(); // 配置中间件 app.UseStaticFiles(); // 运行主机 app.Run(); ``` ## 衍生拓展[#](https://www.cnblogs.com/boise/p/17700124.html#%E8%A1%8D%E7%94%9F%E6%8B%93%E5%B1%95) ### 常见疑问:[#](https://www.cnblogs.com/boise/p/17700124.html#%E5%B8%B8%E8%A7%81%E7%96%91%E9%97%AE) 1. #### **为什么不把调用的 WebHost.CreateDefaultBuilder() / Host.CreateDefaultBuilder()方法直接放在 Main 函数中,而再写一个 CreatetWebHosBuilder() / CreateHostBuilder()方法包裹起来?**[#](https://www.cnblogs.com/boise/p/17700124.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E6%8A%8A%E8%B0%83%E7%94%A8%E7%9A%84webhostcreatedefaultbuilder--hostcreatedefaultbuilder%E6%96%B9%E6%B3%95%E7%9B%B4%E6%8E%A5%E6%94%BE%E5%9C%A8main%E5%87%BD%E6%95%B0%E4%B8%AD%E8%80%8C%E5%86%8D%E5%86%99%E4%B8%80%E4%B8%AAcreatetwebhosbuilder--createhostbuilder%E6%96%B9%E6%B3%95%E5%8C%85%E8%A3%B9%E8%B5%B7%E6%9D%A5) 答:因为是为了区分在 Main 函数中对生成的主机对象调用 Run()的代码,比如在使用 EF Core 的时候,就必须要有这种区分。 2. #### **Program.cs 文件中 CreateDefaultBuilder()方法的作用?**[#](https://www.cnblogs.com/boise/p/17700124.html#programcs%E6%96%87%E4%BB%B6%E4%B8%ADcreatedefaultbuilder%E6%96%B9%E6%B3%95%E7%9A%84%E4%BD%9C%E7%94%A8) 答:无论是 WebHost 还是 Host,他们调用各自的 CreateDefaultBuilder()方法主要是执行以下任务 1. 将根目录设置为 Directory.GetCurrenDirectory()方法返回的路径 2. 通过命令行、前缀为 ASPNETCORE\_的环境变量加载主机配置 3. 加载应用配置,按照 appsetting.json、appsetting.{Environment}.json、入口程序集的用户机密、环境变量、命令行参数 4. 配置控制台和调试输出的日志记录 5. 使用 ASP NET Core 模块在 IIS 后运行,默认会继承 IIS 6. 包含一些拓展方法,如 ConfigureAppConfiguration()拓展配置
个人天使
2025年2月10日 13:55
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码