我有一个非托管应用程序,它的某些用户界面使用 WPF 程序集。由于这种安排Application.Current不是自动创建的。因此,当加载第一个 WPF 窗口时,我的代码执行以下操作:
if (System.Windows.Application.Current == null)
{
new System.Windows.Application();
}
Run Code Online (Sandbox Code Playgroud)
这是第一次有效,是我见过的推荐方法。
但是,如果用户关闭(唯一的)WPF 窗口,然后再次加载它,即使Current == null在调用 Application ctor 时再次抛出异常也是如此。
在文档中很清楚每个 AppDomain 只能有一个应用程序 -但是为什么 Current 为 null 而我无法创建它?
抛出的异常属于类型InvalidOperationException并具有以下消息:
不能在同一个 AppDomain 中创建多个 System.Windows.Application 实例。
它InnerException是空的。
为了解决这个问题,我试图:
构建Application使用ShutdownMode = ShutdownMode.OnLastWindowClose
Current.Shutdown()WPF窗口关闭时显式调用
但两者都没有任何区别。
还有其他方法可以手动管理Current对象的生命周期吗?或者我应该在非托管应用程序启动时尝试创建它,然后依赖它在进程的生命周期中始终设置?
您链接的文档在其备注部分中说明了以下内容:
每个 AppDomain 只能创建 Application 类的一个实例,以确保对一组应用程序范围窗口、属性和资源数据的共享访问。因此, Application 类的无参数构造函数会检测正在初始化的实例是否是 AppDomain 中的第一个实例;如果不是,则抛出 InvalidOperationException。
我强调的部分意味着它不检查它是否是当前运行的唯一/单个应用程序,而是检查Application之前是否已初始化任何其他实例(无论它是否已关闭)。
查看该类的源代码Application证实了这一点:Application该类在内部使用了一个静态标志 ( _appCreatedInThisAppDomain),该标志在初始化第一个Application实例时只设置一次。但显然这个标志永远不会重置,这会阻止您Application在同一个 AppDomain 中创建更多实例。