仅在 .appxupload 中缺少系统程序集

Missing system assembly in .appxupload only

我们正在开发一个 UWP LOB 应用程序,将通过 Windows 商业商店发布(构建目标 >= 1607)。 UWP 应用程序引用:

该应用程序将在调试和发布(通过 .NET 本机编译)模式下在本地进行编译和 运行。将 .appxupload 上传到 Windows Store 时,生成的应用程序将抛出异​​常:

System.IO.FileNotFoundException: Could not load file or assembly 'System.Private.Reflection.Extensibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. File name: 'System.Private.Reflection.Extensibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' at Internal.Reflection.Extensions.NonPortable.PropertyPolicies.GetInheritedMemberInfo(PropertyInfo underlyingMemberInfo, Type reflectedType) at Internal.Reflection.Extensions.NonPortable.MemberEnumerator.d__11.MoveNext() at System.Collections.Generic.LowLevelList1.InsertRange(Int32 index, IEnumerable`1 collection) at System.Reflection.TypeExtensions.GetMembers(Type type, Object nameFilterOrAnyName, BindingFlags bindingAttr) at System.Reflection.TypeExtensions.GetMembers(Type type, BindingFlags bindingAttr) at Stubble.Core.Settings.RendererSettingsDefaults.GetMemberLookup(Type objectType)

.appxupload 中提取 .appxbundle 并通过 PowerShell 旁加载程序包时,我可以重现此问题。请注意,.appxupload 中的 .appxbundle 具有 .NET 程序集,因此未编译为 .NET 本机。

我认为 Windows Store 应该执行这个任务,但它实际上没有(正如你从上面的堆栈跟踪中看到的那样)——可能是因为我们正在利用我们的 UWP 应用程序的桌面桥功能。

搜索 System.Private.Reflection.Extensibility.dll 时,该程序集似乎与 .NET Native 和构建链相关(因为它与 .NET Native nuget 包和 MSBuild 一起提供)。

所以我的问题是:为什么应用程序无法加载程序集(但在 debug/release 模式下却没有)? System.Reflection.TypeExtensions 是否希望应用程序使用实际在本地运行的 .NET Native 进行编译?

我试过了:

所以问题似乎是由 Windows Store 未使用 .NET Native 重新编译 AppX 包引起的。

如果您在本地构建 UWP 应用程序,则...

  • 调试模式,您将获得带有 .NET 程序集的 AppX 包和对 .NET Core CLR 的引用(有效)
  • 发布模式,您将获得一个 AppX 包,其中包含本机编译的应用程序和对 .NET Native 运行时的引用(同样有效)

在创建要提交到 Windows 应用商店的应用程序包时,您将获得一个包含 .NET 程序集的 AppX 包以及对 [=39] 应使用的 .NET Native 版本的引用=] 存储重新编译应用程序(由您使用的 Microsoft.NETCore.UniversalWindowsPlatform nuget 包的版本决定)。

对于启用了 runFullTrust 功能的应用程序,应用商店将不会 重新编译应用程序。因此,您将分发一个包含 .NET 程序集并依赖于 .NET Native 运行时(实际上运行得非常好)的 AppX 包。一旦 CLR 尝试加载 .NET Core 实现的程序集,您就会收到上述错误。此外,与 .NET Native 编译的应用程序相比,您的应用程序会慢很多。

猜测 对于启用了 runFullTrust 的常规 AppX 包,商店无法决定是否重新编译应用程序,因为这样的包可能包含其他应用程序类型(例如 Windows 表单或 WPF)。

要解决此问题,请创建一个 "Windows Application Packaging Project" 并添加 UWP 应用程序作为参考。将从该项目生成的 AppX 包提交到商店。 Windows Store 将按预期重新编译 .NET 程序集。

如需进一步参考,请参阅