[英]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.