仅在 .appxupload 中缺少系统程序集
Missing system assembly in .appxupload only
我们正在开发一个 UWP LOB 应用程序,将通过 Windows 商业商店发布(构建目标 >= 1607)。 UWP 应用程序引用:
- Stubble.Core 通过 nuget(目标 .NET Standard 1.3)引用
- System.Reflection.TypeExtensions 4.3.0,其中引用了
System.Private.Reflection.Extensibility.dll
版本 4.0.0.0
.
该应用程序将在调试和发布(通过 .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 进行编译?
我试过了:
- 正在上传使用 .NET Native 编译的
.appxbundle
(商店不接受)
- 引用不同版本的
Microsoft.NETCore.UniversalWindowsPlatform
包(包括 .NET Native 包)
- 手动引用私有库(由于重复的程序集引用而产生编译器错误)
- 正在将
System.Reflection.TypeExtensions
升级到 4.4
- 为部署创建了一个
.wapproj
包装器(问题保持不变)
- 添加了绑定重定向,这会导致应用程序崩溃
所以问题似乎是由 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 程序集。
如需进一步参考,请参阅 。
我们正在开发一个 UWP LOB 应用程序,将通过 Windows 商业商店发布(构建目标 >= 1607)。 UWP 应用程序引用:
- Stubble.Core 通过 nuget(目标 .NET Standard 1.3)引用
- System.Reflection.TypeExtensions 4.3.0,其中引用了
System.Private.Reflection.Extensibility.dll
版本4.0.0.0
.
该应用程序将在调试和发布(通过 .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 进行编译?
我试过了:
- 正在上传使用 .NET Native 编译的
.appxbundle
(商店不接受) - 引用不同版本的
Microsoft.NETCore.UniversalWindowsPlatform
包(包括 .NET Native 包) - 手动引用私有库(由于重复的程序集引用而产生编译器错误)
- 正在将
System.Reflection.TypeExtensions
升级到 4.4 - 为部署创建了一个
.wapproj
包装器(问题保持不变) - 添加了绑定重定向,这会导致应用程序崩溃
所以问题似乎是由 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 程序集。
如需进一步参考,请参阅