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

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() &gt; 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>;
  • 禁用代码修剪与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:31:42