Windows Store修改应用包致Lottie动画崩溃,求解决方案
问题解决方案:WPF+Xaml Islands+Lottie-Windows商店部署问题
问题背景
开发WPF应用时使用Xaml Islands实现Win10风格,通过Lottie-Windows播放AE动画,本地开发正常。打包Desktop Bridge项目时遇到应用清单验证错误,使用_RemoveWinMDFromAppxManifest的MSBuild Target解决了打包问题并成功提交商店,但商店安装后Lottie动画崩溃,本地安装同一包则正常,怀疑商店优化导致包内容变更。
1. 除现有方法外,解决应用清单验证错误的其他方式
- 手动清理生成后的清单文件:构建完成后,手动打开生成的
AppxManifest.xml,删除<Dependencies>节点下重复的<Package>依赖条目。适合临时测试,不适合自动化构建流程。 - 调整NuGet包引用策略:检查Lottie-Windows、Xaml Islands相关包的版本兼容性,避免引入重复的UWP依赖。在
PackageReference中通过ExcludeAssets排除不必要的winmd或依赖项,例如:<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Lottie" Version="x.x.x"> <ExcludeAssets>winmd</ExcludeAssets> </PackageReference> - 禁用自动依赖收割:在Desktop Bridge项目文件中设置
<EnableWinMDHarvesting>false</EnableWinMDHarvesting>,关闭自动依赖生成功能,然后手动在清单中添加必要的依赖项。
2. 构建时移除AppxManifest重复项的其他方法
- 使用MSBuild XmlPoke任务精准移除重复项:编写Target定位并删除指定的重复依赖节点,避免全盘移除所有winmd收割项,示例:
<Target Name="RemoveDuplicateXamlDependencies" AfterTargets="_GenerateCurrentProjectAppxManifest"> <!-- 移除重复的Microsoft.UI.Xaml依赖 --> <XmlPoke XmlInputPath="$(AppxManifest)" Query="/Package/Dependencies/Package[@Name='Microsoft.UI.Xaml'][position() > 1]" Value="" /> </Target> - 构建后PowerShell脚本清理:在项目的
PostBuildEvent中执行PowerShell脚本,自动去重清单中的依赖项,示例脚本:$manifestPath = "$(TargetDir)AppxManifest.xml" $xml = [xml](Get-Content $manifestPath) $dependencyNodes = $xml.SelectNodes("/Package/Dependencies/Package") $seenPackageNames = @{} foreach ($node in $dependencyNodes) { if ($seenPackageNames.ContainsKey($node.Name)) { $node.ParentNode.RemoveChild($node) | Out-Null } else { $seenPackageNames[$node.Name] = $true } } $xml.Save($manifestPath)
3. 修复商店安装后Lottie动画崩溃的方法
核心原因是原有Workaround全盘移除了winmd收割项,导致Lottie所需的UWP组件未被正确打包进商店版本,商店优化进一步加剧了缺失问题。
- 精准移除重复依赖,保留Lottie所需winmd:修改原有MSBuild Target,只移除引发重复的特定winmd(如
Microsoft.UI.Xaml),而非全部移除,示例:<Target Name="_RemoveDuplicateWinMDFromAppxManifest" BeforeTargets="_GenerateCurrentProjectAppxManifest"> <ItemGroup> <!-- 仅移除重复的Microsoft.UI.Xaml winmd --> <_AppxWinmdFilesToHarvest Remove="@(_AppxWinmdFilesToHarvest)" Condition="'%(Filename)' == 'Microsoft.UI.Xaml'" /> </ItemGroup> </Target> - 确保Lottie资源被正确打包:
- 检查Lottie动画文件(.json)的属性,设置
Build Action为Content,Copy to Output Directory为Copy if newer; - 在NuGet引用中确保Lottie-Windows的资源被包含,设置
<IncludeAssets>all</IncludeAssets>;
- 检查Lottie动画文件(.json)的属性,设置
- 禁用代码修剪与Native编译:在项目文件中添加以下配置,避免商店优化移除Lottie所需的类型:
<!-- 禁用.NET Native编译(仅测试用,发布时可根据情况调整) --> <EnableDotNetNativeCompile>false</EnableDotNetNativeCompile> <!-- 排除Lottie程序集被修剪 --> <ItemGroup> <TrimmerRootAssembly Include="Microsoft.Toolkit.Uwp.UI.Lottie" /> <TrimmerRootAssembly Include="Microsoft.Toolkit.Uwp.UI.Controls" /> </ItemGroup> - 调试商店版本:使用Visual Studio的"Package Debugging"功能安装商店版本的应用,附加调试器捕获详细异常,确认是否存在缺失的组件或资源。
内容的提问来源于stack exchange,提问作者Attila Szász
相关产品推荐
相关产品推荐

