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

时间:2018-05-07 13:59:25

标签: c# uwp nuget .net-standard .net-native

我们正在开发一个UWP LOB应用程序,以便通过Windows Store for Business发布(构建目标> = 1607)。 UWP应用程序引用:

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

  

System.IO.FileNotFoundException:无法加载文件或程序集&System; .Private.Reflection.Extensibility,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个依赖项。该系统找不到指定的文件。   文件名:' System.Private.Reflection.Extensibility,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'      在Internal.Reflection.Extensions.NonPortable.PropertyPolicies.GetInheritedMemberInfo(PropertyInfo underlyingMemberInfo,Type reflectType)      在Internal.Reflection.Extensions.NonPortable.MemberEnumerator.d__11.MoveNext()      在System.Collections.Generic.LowLevelList1.InsertRange(Int32索引,IEnumerable`1集合)      在System.Reflection.TypeExtensions.GetMembers(Type type,Object nameFilterOrAnyName,BindingFlags bindingAttr)      在System.Reflection.TypeExtensions.GetMembers(Type type,BindingFlags bindingAttr)      在Stubble.Core.Settings.RendererSettingsDefaults.GetMemberLookup(Type objectType)

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

我认为Windows应用商店应该执行此任务,但实际上并没有(正如您从上面的堆栈跟踪中看到的那样) - 也许是因为我们正在利用桌面桥功能我们的UWP应用程序。

当搜索System.Private.Reflection.Extensibility.dll时,似乎这个程序集与.NET Native和构建链(因为它附带.NET Native nuget包和MSBuild)有关。

所以我的问题是:为什么应用程序无法加载程序集(但不在调试/发布模式下)? System.Reflection.TypeExtensions是否期望使用实际在本地工作的.NET Native编译应用程序?

我试过了:

  • 上传使用.NET Native编译的.appxbundle(商店不接受)
  • 引用不同版本的 Microsoft.NETCore.UniversalWindowsPlatform包(包括.NET Native包)
  • 手动引用私有库(由于重复的程序集引用而产生编译器错误)
  • System.Reflection.TypeExtensions升级到4.4
  • 为部署创建了.wapproj包装器(问题保持不变)
  • 添加了绑定重定向,导致应用崩溃

1 个答案:

答案 0 :(得分:2)

因此问题似乎是由于Windows应用商店没有使用.NET Native重新编译AppX捆绑包。

如果你在本地建立一个UWP应用程序,那么......

  • 调试模式,您将获得一个带有.NET程序集的AppX软件包以及对.NET Core CLR的引用(可以工作)
  • 发布模式,您将获得一个AppX捆绑包,其中包含本机编译的应用程序和对.NET Native运行时的引用(也适用)

创建要提交到Windows应用商店的应用包时,您将获得一个带有.NET程序集的AppX包和一个.NET Native版本的引用,Windows应用程序应该使用它来重新编译应用程序(由您正在使用的Microsoft.NETCore.UniversalWindowsPlatform nuget包的版本决定。

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

对于启用了runFullTrust的常规AppX捆绑包,我,商店无法决定是否重新编译应用,因为这样的包可以包含其他应用类型(例如Windows Forms)或WPF)。

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

有关详细信息,请参阅Could not load file or assembly 'System.Private.CoreLib...'