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

Prism WPF应用中如何用StartupEventArgs选择配置文件?

问题描述

我想在C# WPF Prism应用中通过StartupEventArgs确定要加载的应用配置JSON文件,请问这可行吗?我已经在App.xaml.cs中重写了OnStartup方法来使用StartupEventArgs,但正如Prism文档所说,这会导致主窗口打开两次。我没在Prism文档里找到相关解决办法,求帮忙!

补充代码(导致主窗口重复打开的OnStartup方法):

protected override void OnStartup(StartupEventArgs e)
{
    string env = null;
    // Check for env in startup args
    for (int i = 0; i < e.Args.Length; i++)
    {
        if (e.Args[i].Equals("-config"))
        {
            _environmentTag = e.Args[i + 1];
            switch (e.Args[i + 1])
            {
                case "Live":
                    env = "appsettings.json";
                    break;
                case "Test":
                    env = "appsettings.Development.json";
                    break;
                default:
                    env = null;
                    break;
            }
        }
        var builder = new ConfigurationBuilder()
            .SetBasePath(Environment.CurrentDirectory)
            .AddJsonFile(env, optional: false, reloadOnChange: false);
        _configuration = builder.Build();

        OnInitialized();
        base.OnStartup(e);
    }
}
解决办法

你的代码存在两个核心问题,直接导致主窗口重复打开:

  1. OnInitialized()和base.OnStartup(e)被放在循环内部:只要启动参数有多个条目,这两个方法就会被调用多次,而Prism中这两个方法都会触发主窗口初始化逻辑,多次调用自然会打开多个窗口。
  2. 配置构建逻辑位置错误:每次循环都重新构建配置,且未处理env为null的情况,会导致配置构建失败。

修正后的代码示例:

protected override void OnStartup(StartupEventArgs e)
{
    // 设置默认配置和环境标记,避免未传参数时出错
    string env = "appsettings.json"; 
    _environmentTag = "Live"; 

    // 遍历启动参数,匹配-config选项
    for (int i = 0; i < e.Args.Length; i++)
    {
        // 加边界检查,避免数组越界
        if (e.Args[i].Equals("-config") && i + 1 < e.Args.Length)
        {
            _environmentTag = e.Args[i + 1];
            switch (_environmentTag)
            {
                case "Live":
                    env = "appsettings.json";
                    break;
                case "Test":
                    env = "appsettings.Development.json";
                    break;
                default:
                    // 未知环境可抛出异常,或沿用默认配置
                    throw new ArgumentException($"不支持的环境参数:{_environmentTag}");
                    // 若不想抛异常,可注释上面代码,启用下面两行
                    // env = "appsettings.json";
                    // _environmentTag = "Live";
                    break;
            }
            break; // 找到目标参数后退出循环,避免重复处理
        }
    }

    // 构建配置文件
    var builder = new ConfigurationBuilder()
        .SetBasePath(Environment.CurrentDirectory)
        .AddJsonFile(env, optional: false, reloadOnChange: false);
    _configuration = builder.Build();

    // Prism的正确流程:先调用base.OnStartup,内部会自动处理初始化逻辑,不要手动调用OnInitialized
    base.OnStartup(e);
}

额外注意事项:

  • Prism的Application基类已封装完整初始化流程,重写OnStartup时不要手动调用OnInitialized(),base.OnStartup内部会自动触发正确的初始化步骤。
  • 遍历启动参数时必须加边界检查,防止因参数不完整导致数组越界异常。
  • 给env设置默认值,确保启动时未传-config参数也能正常加载配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:40:06