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); } }
解决办法
你的代码存在两个核心问题,直接导致主窗口重复打开:
OnInitialized()和base.OnStartup(e)被放在循环内部:只要启动参数有多个条目,这两个方法就会被调用多次,而Prism中这两个方法都会触发主窗口初始化逻辑,多次调用自然会打开多个窗口。- 配置构建逻辑位置错误:每次循环都重新构建配置,且未处理
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
相关产品推荐
相关产品推荐

