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

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

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

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

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 native 。

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

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

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

我试过:

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

最佳答案

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

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

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

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

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

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

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

如需进一步引用,请参阅 Could not load file or assembly 'System.Private.CoreLib...' .

关于c# - 仅在 .appxupload 中缺少系统程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50216085/

相关文章:

visual-studio - 如何在 Visual Studio 2017 RC 中从 .NET Core MSBuild 项目创建 NuGet 包?

c# - 如何使用Moq框架对azure服务结构进行单元测试?

c# - 覆盖 ToString() 并添加到 ListBox C#

c# - UWP - FlipView - 需要 FlipView 才能仅加载单个项目内容

uwp - AutoSuggestBox - 更改查询图标大小

visual-studio-2010 - 是否有用于退出或关闭 nuGet 包管理器控制台的键盘快捷键?

c# - DataGridView Winforms 填充 ComboBoxCell

c# - 使用抽象类型的反射从表中获取实体

xaml - Windows 10 UWP 中具有自定义附加属性的自适应触发器

visual-studio - Visual Studio 'packages' 元素未声明警告