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

第一个Application调用.Shutdown()后如何声明第二个新的Application对象?

解决WPF中调用Application.Shutdown()后创建新Application实例的异常问题

嘿,这个问题我之前也踩过坑——默认情况下,一个进程只能存在一个Application实例,而且一旦调用了Shutdown(),框架内部会标记这个App实例已终止,再尝试new App()就会触发InvalidOperationException。不过有几种可行的方案绕开这个限制,我给你拆解下:

方案1:不销毁Application,仅重启UI窗口(最推荐)

如果你的需求只是重置应用的UI状态,完全没必要销毁整个Application对象。可以通过关闭所有现有窗口,再重新创建主窗口的方式实现“重启”效果:

// 关闭所有非主窗口
foreach (Window window in Application.Current.Windows)
{
    if (window != Application.Current.MainWindow)
        window.Close();
}

// 关闭当前主窗口后重新实例化并显示
Application.Current.MainWindow.Close();
Application.Current.MainWindow = new MainWindow();
Application.Current.MainWindow.Show();

这种方法完全符合WPF的设计逻辑,没有任何黑科技,稳定性拉满,是最优先考虑的方案。

方案2:用AppDomain隔离多个Application实例

如果必须完全销毁旧的Application并创建新实例,可以利用AppDomain隔离——每个AppDomain可以拥有独立的Application实例。你可以把应用的核心逻辑放到子AppDomain中,需要重启时卸载旧域、创建新域并重新启动:

// 主AppDomain入口
static void Main()
{
    // 创建子AppDomain并启动应用
    var appDomain = AppDomain.CreateDomain("AppRestartDomain");
    appDomain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location);
    AppDomain.Unload(appDomain);
}

// 子AppDomain的应用入口(需要在项目属性里设置启动对象为这个方法)
public static void AppEntry()
{
    var app = new App();
    app.Run(new MainWindow());
}

这种方式是官方认可的隔离方案,能彻底重置应用状态,但需要注意AppDomain之间的资源管理和通信问题,适合对状态隔离要求极高的场景。

方案3:反射重置Application内部状态(不推荐)

通过反射修改WPF框架的内部静态字段,强制让框架认为没有Active的Application实例。这种方法属于“黑科技”,依赖框架内部实现,可能随.NET版本更新失效:

// 在调用Shutdown()之后执行
var currentField = typeof(Application).GetField("_current", BindingFlags.NonPublic | BindingFlags.Static);
currentField.SetValue(null, null);

// 现在可以创建新的Application实例了
var newApp = new App();
newApp.Run(new MainWindow());

⚠️ 强烈不建议在生产环境使用,因为WPF的内部实现细节可能在.NET Framework和.NET Core/.NET 5+之间有差异,容易引发未知的崩溃或内存泄漏。

总结一下:优先用方案1,简单稳定;如果必须完全重建Application,选方案2;方案3只适合临时测试或特殊场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:28:11