【问题标题】:Missing system assembly in .appxupload only仅 .appxupload 中缺少系统程序集
【发布时间】:2018-05-07 13:59:25
【问题描述】:

我们正在开发一个 UWP LOB 应用,以通过适用于企业的 Windows 应用商店发布(构建目标 >= 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,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a' 在 Internal.Reflection.Extensions.NonPortable.PropertyPolicies.GetInheritedMemberInfo(PropertyInfounderlyingMemberInfo,类型 reflectType) 在 Internal.Reflection.Extensions.NonPortable.MemberEnumerator.d__11.MoveNext() 在 System.Collections.Generic.LowLevelList1.InsertRange(Int32 索引,IEnumerable`1 集合) 在 System.Reflection.TypeExtensions.GetMembers(类型类型,对象名称FilterOrAnyName,BindingFlags bindingAttr) 在 System.Reflection.TypeExtensions.GetMembers(类型类型,BindingFlags bindingAttr) 在 Stubble.Core.Settings.RendererSettingsDefaults.GetMemberLookup(Type objectType)

.appxupload 中提取.appxbundle 并通过PowerShell 侧载程序包时,我可以重现此问题。请注意,.appxupload 中的 .appxbundle 具有 .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 包装器(问题保持不变)
  • 添加了绑定重定向,导致应用崩溃

【问题讨论】:

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


【解决方案1】:

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

如果你在本地构建 UWP 应用,在 ...

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2016-05-12
    相关资源
    最近更新 更多