WinUI3调用Application().Current().Exit()崩溃问题排查与解决
WinUI3 按钮退出应用报错的原因及解决方法
问题重现
用户编写的按钮点击事件代码:
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { winrt::Microsoft::UI::Xaml::Application().Current().Exit(); }
点击按钮后触发错误,调用栈如下:
KernelBase.dll!00007ff997994ffc() Unknown [External Code] > Example.exe!winrt::throw_hresult(const winrt::hresult result) Line 5016 C++ Example.exe!winrt::check_hresult(const winrt::hresult result) Line 5087 C++ Example.exe!winrt::impl::consume_Microsoft_UI_Xaml_IApplicationFactory<winrt::Microsoft::UI::Xaml::IApplicationFactory>::CreateInstance(const winrt::Windows::Foundation::IInspectable & baseInterface, winrt::Windows::Foundation::IInspectable & innerInterface) Line 144 C++ Example.exe!winrt::Microsoft::UI::Xaml::Application::{ctor}::__l2::<lambda>(const winrt::Microsoft::UI::Xaml::IApplicationFactory & f) Line 12262 C++ Example.exe!winrt::impl::call_factory<winrt::Microsoft::UI::Xaml::Application,winrt::Microsoft::UI::Xaml::IApplicationFactory,winrt::Microsoft::UI::Xaml::Application <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationFactory &)>(winrt::Microsoft::UI::Xaml::Application::{ctor}::__l2::winrt::Microsoft::UI::Xaml::Application <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationFactory &) && callback) Line 6397 C++ Example.exe!winrt::Microsoft::UI::Xaml::Application::Application() Line 12262 C++ Example.exe!winrt::Example::implementation::MainWindow::myButton_Click(const winrt::Windows::Foundation::IInspectable & __formal, const winrt::Microsoft::UI::Xaml::RoutedEventArgs & __formal) Line 35 C++ [External Code] Example.exe!winrt::impl::delegate<winrt::Microsoft::UI::Xaml::RoutedEventHandler,void <lambda>(const winrt::Windows::Foundation::IInspectable &, const winrt::Microsoft::UI::Xaml::RoutedEventArgs &)>::Invoke(void * sender, void * e) Line 4838 C++ [External Code] Example.exe!winrt::impl::consume_Microsoft_UI_Xaml_IApplicationStatics<winrt::Microsoft::UI::Xaml::IApplicationStatics>::Start(const winrt::Microsoft::UI::Xaml::ApplicationInitializationCallback & callback) Line 158 C++ Example.exe!winrt::Microsoft::UI::Xaml::Application::Start::__l2::<lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics & f) Line 12270 C++ Example.exe!winrt::impl::factory_cache_entry<winrt::Microsoft::UI::Xaml::Application,winrt::Microsoft::UI::Xaml::IApplicationStatics>::call<void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &) &>(winrt::Microsoft::UI::Xaml::Application::Start::__l2::void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &) & callback) Line 6379 C++ Example.exe!winrt::impl::call_factory<winrt::Microsoft::UI::Xaml::Application,winrt::Microsoft::UI::Xaml::IApplicationStatics,void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &)>(winrt::Microsoft::UI::Xaml::Application::Start::__l2::void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &) && callback) Line 6402 C++ Example.exe!winrt::Microsoft::UI::Xaml::Application::Start(const winrt::Microsoft::UI::Xaml::ApplicationInitializationCallback & callback) Line 12271 C++ [External Code]
错误原因
从调用栈可以看出,代码中winrt::Microsoft::UI::Xaml::Application()是新建了一个Application实例,而非获取当前运行的应用实例。WinUI3中Application是单例模式,运行时不允许重复创建实例,强行创建会触发异常。
解决方法
直接通过静态方法获取当前已存在的Application实例,修改后的代码如下:
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { winrt::Microsoft::UI::Xaml::Application::Current().Exit(); }
核心变化是去掉Application()的构造调用,改用Application::Current()获取当前应用实例,再调用Exit()即可正常退出应用。
内容的提问来源于stack exchange,提问作者yonutix
相关产品推荐
相关产品推荐

