商店版桌面应用调用MddBootstrapInitialize失败求解决方案
解决Win32 MSIX打包应用调用MddBootstrapInitialize返回ERROR_NOT_SUPPORTED的问题
核心原因
MSIX打包的应用运行在C:\Program Files\WindowsApps的沙箱环境中,系统会通过AppxManifest.xml的依赖声明自动管理框架组件加载,手动调用MddBootstrapInitialize()会与系统的依赖解析机制冲突,从而返回ERROR_NOT_SUPPORTED。
解决方案
1. 在AppxManifest.xml中添加WinUI3依赖声明
通过清单告知系统自动加载WinUI3可再发行组件,无需手动调用MddBootstrapInitialize()。在Dependencies节点下添加WinUI3的包依赖:
<Dependencies> <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.22621.0" /> <!-- 替换为你使用的WinUI3版本对应的依赖信息 --> <PackageDependency Name="Microsoft.UI.Xaml.2.8" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" MinVersion="8.2306.22001.0" /> </Dependencies>
- 注意:
Name和MinVersion需与你开发时使用的WinUI3版本匹配,可在项目的NuGet包引用中查看具体版本。
2. 在代码中区分打包/非打包场景调用逻辑
保留非MSIX场景下的MddBootstrapInitialize()调用,同时在MSIX打包场景下跳过该调用:
#include <windows.h> #include <appmodel.h> bool IsAppPackaged() { UINT32 length = 0; LONG result = GetCurrentPackageFamilyName(&length, nullptr); return result != ERROR_INSUFFICIENT_BUFFER ? false : true; } // 初始化逻辑 void InitializeWinUI3() { if (!IsAppPackaged()) { // 非MSIX场景下调用MddBootstrapInitialize HRESULT hr = MddBootstrapInitialize(0x00010000, MddBootstrapInitializeOptions_None); if (FAILED(hr)) { // 处理初始化失败 } } // MSIX场景下系统自动加载依赖,无需手动初始化 }
3. 验证MSIX包的依赖配置
使用PowerShell命令检查包的依赖是否正确注册:
Get-AppxPackageDependency -PackageFamilyName "你的应用包族名"
若依赖缺失,需确保提交应用商店时清单中的依赖声明正确,或让用户手动安装对应版本的WinUI3可再发行组件。
4. 正确使用makemsix.exe打包
确保打包时指定了正确的AppxManifest.xml路径,并且没有遗漏依赖相关配置。可使用以下命令格式打包:
makemsix.exe pack -d "你的应用文件目录" -p "输出的MSIX包路径" -m "AppxManifest.xml"
内容的提问来源于stack exchange,提问作者Michael Chourdakis
相关产品推荐
相关产品推荐

