如何在原生Win32项目中集成WinUI3功能(弃用XAML Islands)
Win32项目集成WinUI3的困境与疑问
需求背景
- 目标:创建原生Win32项目并集成WinUI3功能,弃用XAML Islands(非真正WinUI3实现)
- 核心要求:运行时可检测WinUI3可用性,不可用时仍能在Windows 7等系统正常运行
- 当前现状:仅能通过非打包WinUI3可执行文件与Win32可执行文件借助共享内存、互斥体通信来显示WinUI3对话框,操作繁琐
已尝试的两种实现路径
路径1:从非打包WinUI3项目(简称"w")改造为Win32应用
- 项目
.vcxproj中存在<ApplicationType>Windows Store</ApplicationType>配置,移除后Visual Studio无法自动生成App.xaml.g.h等.g后缀的代码文件
路径2:从原生Win32项目(简称"c")改造为支持WinUI3的应用
- 通过NuGet引入WindowsAppSDK,Bootstrap初始化代码执行成功:
CoInitializeEx(0, COINIT_APARTMENTTHREADED); PACKAGE_VERSION pg = {}; auto hr = MddBootstrapInitialize(WINDOWSAPPSDK_RELEASE_MAJORMINOR, L"", pg); if (FAILED(hr)) return 0;
- 参照"w"项目编写App.xaml加载代码,执行
winrt::Windows::UI::Xaml::Application::LoadComponent(*this, resourceLocator);时触发线程错误异常:
struct App : public winrt::Windows::UI::Xaml::Application { App() { winrt::Windows::Foundation::Uri resourceLocator{ L"f:\\wui3tests\\c\\app.xaml" }; winrt::Windows::UI::Xaml::Application::LoadComponent(*this, resourceLocator); } };
- "w"项目中对应的加载代码:
::winrt::Windows::Foundation::Uri resourceLocator{ L"ms-appx:///App.xaml" }; ::winrt::Microsoft::UI::Xaml::Application::LoadComponent(*this, resourceLocator);
- 跳过LoadComponent步骤后,尝试创建Window的代码触发无效指针异常:
struct MainWindow : public winrt::Windows::UI::Xaml::Window { MainWindow() : winrt::Windows::UI::Xaml::Window(nullptr) { } };
其他尝试问题
- 将"w"项目转为DLL供"c"项目调用时,无论是否调用Bootstrapper API,均出现加载失败问题
核心疑惑
- "w"项目中使用的
ms-appx:///App.xaml是什么?它如何存储在可执行文件中(非资源形式)? - Bootstrap API似乎未发挥实际作用,微软官方Demo仅展示了调用方式,未涉及WinUI3窗口创建的具体实现
最终疑问
是否还有继续推进该方案的必要?
内容的提问来源于stack exchange,提问作者Michael Chourdakis
相关产品推荐
相关产品推荐

