VS2019/2022 .NET 5控制台应用无环境变量实现构建转换问询
解决方案核心思路
利用MSBuild内置的$(Configuration)变量,通过编译常量将当前构建配置名直接嵌入代码,全程不需要环境变量或额外的宿主环境配置文件。
第一步:配置项目文件传递编译常量
编辑你的控制台应用.csproj文件,添加如下配置段,把当前构建配置名作为常量传递给代码:
<PropertyGroup> <DefineConstants>$(DefineConstants);BUILD_CONFIGURATION=$(Configuration)</DefineConstants> </PropertyGroup>
完成配置后,代码中可以直接通过BUILD_CONFIGURATION常量拿到当前的构建配置名,比如Debug、Release或你自定义的Test、Prod等配置名。
第二步:ConfigurationBuilder直接加载对应配置文件(无HostBuilder方案)
不需要引入Host相关包,沿用你原来的ConfigurationBuilder用法即可,示例代码如下:
using Microsoft.Extensions.Configuration; using System; using System.IO; namespace ConsoleAppDemo { class Program { static IConfiguration _iconfig; static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) // 加载基础公共配置 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // 加载对应构建配置的差异化配置 .AddJsonFile($"appsettings.{BUILD_CONFIGURATION}.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); _iconfig = builder.Build(); // 读取配置的用法和你之前的习惯完全一致 var mySetting = _iconfig["mysetting"]; var connStr = _iconfig.GetConnectionString("DefaultConnection"); Console.WriteLine($"配置值:{mySetting}"); Console.WriteLine($"连接字符串:{connStr}"); } } }
可选方案:HostBuilder场景读取配置的方法
如果你需要使用HostBuilder,配置构建完成后可以直接从依赖注入容器中获取IConfiguration实例,示例代码如下:
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Configuration; using System; namespace ConsoleAppDemo { class Program { static void Main(string[] args) { var host = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { // 可根据需求清空默认配置源 config.Sources.Clear(); config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{BUILD_CONFIGURATION}.json", optional: true, reloadOnChange: true); }) .Build(); // 从Host的服务容器中获取配置实例 var config = host.Services.GetRequiredService<IConfiguration>(); // 读取配置方式不变 var mySetting = config["mysetting"]; var connStr = config.GetConnectionString("DefaultConnection"); // 若有后台托管服务可调用 host.Run() 启动 } } }
注意事项
- 所有
appsettings.*.json文件的属性需设置为:复制到输出目录 = 如果较新则复制,保证构建时文件会输出到运行目录 - 切换VS解决方案配置后需要重新生成项目,编译常量才会更新为对应配置名
内容的提问来源于stack exchange,提问作者AndyW
相关产品推荐
相关产品推荐

