[英]How can I declare a second, new Application object after the first has shut down?
此问题与重新启动应用程序有关。
我已经看到了这个问题。 但是,这个问题(据我所知)已经有近十年的历史了,而且似乎都没有一个答案可以回答这个特定的问题(关于如何定义第二个Application对象的问题)其.Shutdown
方法称为)。
尝试在第一个具有其.Shutdown( )
方法调用的new App( )
后声明以下异常:
我可以用原始的App
对象做任何事情来防止他发生吗?
符合最小,完整和可验证示例的要求:
确定App.xaml
构建操作已设置到Page
。
App.xaml.cs:
using System;
namespace MCVE {
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App {
private static bool _isRestarting = true;
public static bool IsRestarting {
get => _isRestarting;
set => _isRestarting = value;
}
[STAThread]
public static void Main( ) {
while ( IsRestarting ) {
IsRestarting = false;
App program = new App( );
program.InitializeComponent( );
program.Run( );
}
}
}
}
MainWindow.xaml:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="MCVE.MainWindow"
mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<UniformGrid Rows="1">
<Button Content="Restart" Click="Restart" />
<Button Content="Exit" Click="Shutdown" />
</UniformGrid>
</Window>
MainWindow.Xaml.cs:
using System.Windows;
namespace MCVE {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow( ) {
InitializeComponent( );
}
private void Restart( object sender, RoutedEventArgs e ) {
App.IsRestarting = true;
Shutdown( sender, e );
}
private void Shutdown( object sender, RoutedEventArgs e ) =>
Application.Current?.Shutdown( );
}
}
重现:单击显示Restart
的按钮。
Application
类被设计为只能运行一次,并与其加载到的AppDomain
的生存期相关联。 即使您找到解决该问题的方法,也将与使用该类的意图背道而驰。 (请参阅此处的备注部分。)
我建议不要退后一步,而是退后一步,思考您要达到的目标。 如果要重新启动整个应用程序,请考虑启动一个新进程。 如果要卸载然后重新加载一堆东西,请在单个Application
实例范围内的适当级别将该功能构建到代码中。
根据您要完成的工作,您可能还需要考虑阅读AppDomain
(可以从此处开始,但是如果您四处搜索,可能会有更好的资源)。 AppDomain
专门设计为一个封装的独立竞技场,您可以在其中通过加载和卸载整个域来加载和卸载一堆东西。
我相信也可以在每个域中运行一个Application
实例,但是我从未尝试过类似的方法。 如果执行这样的操作,则可能应避免在默认域中运行Application
实例,因为除非关闭进程,否则永远无法卸载该域。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.