我们正在开发一个UWP LOB应用程序,以便通过Windows Store for Business发布(构建目标> = 1607)。 UWP应用程序引用:
System.Private.Reflection.Extensibility.dll
版本4.0.0.0
。该应用程序将在调试和发布(通过.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编译应用程序?
我试过了:
.appxbundle
(商店不接受)Microsoft.NETCore.UniversalWindowsPlatform
包(包括.NET Native包)System.Reflection.TypeExtensions
升级到4.4 .wapproj
包装器(问题保持不变)答案 0 :(得分:2)
因此问题似乎是由于Windows应用商店没有使用.NET Native重新编译AppX捆绑包。
如果你在本地建立一个UWP应用程序,那么......
创建要提交到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...'。