You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在原生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:09:58