Отсутствует системная сборка только в .appxupload

Мы разрабатываем бизнес-приложение UWP, которое будет опубликовано через Магазин 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 native). При загрузке .appxupload в Магазин Windows полученное приложение выдаст исключение:

System.IO.FileNotFoundException: не удалось загрузить файл или сборку System.Private.Reflection.Extensibility, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a или одну из его зависимостей. Система не может найти указанный файл. Имя файла: 'System.Private.Reflection.Extensibility, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a' в Internal.Reflection.Extensions.NonPortable.PropertyPolicies.GetInheritedMemberInfo (PropertyInfo baseMemberInfo). Тип отраженного Extensions.NonPortable.MemberEnumerator.d__11.MoveNext () в System.Collections.Generic.LowLevelList1.InsertRange (индекс Int32, коллекция IEnumerable`1) в System.Reflection.TypeExtensions.GetMembers (тип типа, имя объектаFilterOrags) в System.Reflection.TypeExtensions. .Reflection.TypeExtensions.GetMembers (тип типа, BindingFlags bindingAttr) в Stubble.Core.Settings.RendererSettingsDefaults.GetMemberLookup (тип objectType)

Я могу воспроизвести эту проблему при извлечении .appxbundle из .appxupload и загрузке пакета через PowerShell. Обратите внимание, что .appxbundle в .appxupload включает сборки .NET и поэтому не компилируется в .NET native.

Я полагаю, что Магазин Windows должен выполнить эту задачу, но на самом деле это не так (как вы можете видеть из трассировки стека выше) - возможно, из-за того, что мы используем функцию Desktop Bridge для нашего приложения UWP.

При поиске System.Private.Reflection.Extensibility.dll кажется, что эта сборка относится к .NET Native и цепочке сборки (поскольку она поставляется с пакетом nuget .NET Native и MSBuild).

Итак, мой вопрос: почему приложение не может загрузить сборку (но не в режиме отладки / выпуска)? System.Reflection.TypeExtensions ожидает ли, что приложение будет скомпилировано с .NET Native, который действительно работает локально?

Я пытался:

  • Загрузка .appxbundle, скомпилированного с .NET Native (что не принято в магазине)
  • Ссылка на разные версии пакета Microsoft.NETCore.UniversalWindowsPlatform (который включает пакеты .NET Native)
  • Ссылка на частную библиотеку вручную (что приводит к ошибкам компилятора из-за дублирования ссылок на сборки)
  • Обновление System.Reflection.TypeExtensions до 4.4
  • Создана .wapproj оболочка для развертывания (проблема остается прежней)
  • Добавлено перенаправление привязки, которое приводит к сбою приложения.

person Gene    schedule 07.05.2018    source источник
comment
Отчасти связано: github.com/NuGet/Home/issues/6201 - я попробуйте сопоставить все версии (.NET Standard, Target SDK, TypeExtensions, .NET nuget package) завтра ...   -  person Gene    schedule 07.05.2018


Ответы (1)


Таким образом, проблема, похоже, вызвана тем, что Магазин Windows не перекомпилировал пакет AppX с .NET Native.

Если вы создаете приложение UWP локально, в ...

  • В режиме отладки вы получите пакет AppX со сборками .NET и ссылку на .NET Core CLR (которая работает)
  • В режиме выпуска вы получите пакет AppX с приложением, скомпилированным в собственном коде, и ссылку на среду выполнения .NET Native (которая также работает).

При создании пакета приложения для отправки в Магазин Windows вы получите пакет AppX со сборками .NET и ссылку на версию .NET Native, которая должна использоваться Магазином Windows для повторной компиляции приложения (определяется версию используемого вами пакета Microsoft.NETCore.UniversalWindowsPlatform nuget).

Для приложений с включенной возможностью runFullTrust Магазин не повторно компилирует приложение. Следовательно, вы будете распространять пакет AppX, который содержит сборки .NET и полагается на среду выполнения .NET Native (которая на самом деле работает замечательно). Как только среда CLR попытается загрузить сборку реализации .NET Core, вы получите указанную выше ошибку. Кроме того, ваше приложение будет работать намного медленнее по сравнению с приложением, скомпилированным в .NET Native.

Я предполагаю для обычного пакета AppX с включенным runFullTrust Магазин не может решить, перекомпилировать ли приложение, поскольку такой пакет может содержать другие типы приложений (например, Windows Forms или WPF).

Чтобы решить эту проблему, создайте «Проект упаковки приложений Windows» и добавьте приложение UWP в качестве ссылки. Отправьте пакет AppX, созданный на основе этого проекта, в магазин. После этого Магазин Windows повторно скомпилирует сборки .NET, как ожидалось.

Для получения дополнительной информации см. Не удалось загрузить файл или сборку «Система. Private.CoreLib ... '.

person Gene    schedule 08.05.2018