You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制.NET 6 WinForms应用使用appsettings.json替代Settings.settings?

.NET 6/7桌面应用用appsettings.json实现动态配置的方案

1. 安装配置依赖包

桌面应用默认不包含.NET配置系统,手动安装以下NuGet包:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json
  • 需类型安全绑定的话,添加Microsoft.Extensions.Configuration.Binder
  • 要使用依赖注入的话,添加Microsoft.Extensions.DependencyInjection

2. 添加并配置appsettings.json

  • 在项目中新建appsettings.json文件,按Web应用格式编写配置项:
{
  "AppSettings": {
    "DbConnString": "Server=.;Database=Demo;Trusted_Connection=True;",
    "MaxRetryCount": 3,
    "LogLevel": "Info"
  }
}
  • 右键文件→属性,设置复制到输出目录为“如果较新则复制”,确保发布后文件出现在应用根目录,可直接编辑。

3. 在应用启动时构建配置

WinForms(Program.cs)

修改启动逻辑,创建全局可访问的配置实例:

using Microsoft.Extensions.Configuration;

namespace WinFormsDemo;

internal static class Program
{
    public static IConfiguration Config { get; private set; }

    [STAThread]
    static void Main()
    {
        Config = new ConfigurationBuilder()
            .SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            // 可选:添加环境变量、命令行参数等扩展配置源
            //.AddEnvironmentVariables()
            .Build();

        ApplicationConfiguration.Initialize();
        Application.Run(new MainForm());
    }
}

WPF(App.xaml.cs)

在启动事件中构建配置:

using Microsoft.Extensions.Configuration;
using System.Windows;

namespace WpfDemo;

public partial class App : Application
{
    public static IConfiguration Config { get; private set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        Config = new ConfigurationBuilder()
            .SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .Build();

        base.OnStartup(e);
    }
}

4. 读取配置的两种方式

直接读取(快速场景)

在窗体或业务代码中直接取值:

var connStr = Program.Config["AppSettings:DbConnString"];
var maxRetry = int.Parse(Program.Config["AppSettings:MaxRetryCount"]);

强类型绑定(推荐,类型安全)

先定义对应配置的类:

namespace WinFormsDemo;

public class AppSettings
{
    public string DbConnString { get; set; }
    public int MaxRetryCount { get; set; }
    public string LogLevel { get; set; }
}

启动时绑定并全局引用:

// 在Program.cs的Main方法中,构建Config后添加
var appSettings = new AppSettings();
Config.Bind("AppSettings", appSettings);
Program.AppSettings = appSettings; // 需在Program类中添加静态属性

使用时直接访问强类型对象:

var connStr = Program.AppSettings.DbConnString;

5. 支持动态重载配置

AddJsonFile的reloadOnChange: true参数会让配置自动感知文件变更。若用依赖注入,结合IOptionsSnapshot可自动获取最新配置值:

// 配置DI容器
var services = new ServiceCollection();
services.AddOptions<AppSettings>().Bind(Config.GetSection("AppSettings"));
services.AddSingleton(Config);
var serviceProvider = services.BuildServiceProvider();

// 窗体构造函数注入
public MainForm(IOptionsSnapshot<AppSettings> settings)
{
    InitializeComponent();
    var latestSettings = settings.Value; // 自动获取最新配置
}

6. 发布时确保配置文件被包含

在项目文件(.csproj)中添加以下配置,避免发布时遗漏文件:

<ItemGroup>
  <None Update="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
  </None>
</ItemGroup>

关于Visual Studio模板

目前VS没有默认带appsettings.json的桌面应用模板,但你可以:

  • 改造现有WinForms/WPF模板,添加上述配置代码和文件后,导出为自定义项目模板(VS菜单→项目→导出模板)
  • 选用社区第三方模板,或等待官方更新(短期来看官方优先维护Web类模板,自行改造更高效)

内容的提问来源于stack exchange,提问作者MC9000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:25:18