Отсутствует сборка системы только в .appxupload - PullRequest
0 голосов
/ 07 мая 2018

Мы разрабатываем приложение UWP LOB, которое будет опубликовано в Магазине Windows для бизнеса (цель сборки> = 1607). Ссылки на приложения UWP:

Приложение будет компилироваться и запускаться локально как в режиме отладки, так и в выпуске (скомпилировано с помощью .NET). При загрузке .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' at Internal.Reflection.Extensions.NonPortable.PropertyPolicies.GetInheritedMemberInfo (PropertyInfo underMemberInfo, Тип отраженный тип) at 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 (тип Type, BindingFlags bindingAttr) at Stubble.Core.Settings.RendererSettingsDefaults.GetMemberLookup (Type objectType)

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

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

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

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

Я пытался:

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

1 Ответ

0 голосов
/ 08 мая 2018

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

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

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

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

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

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

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

Подробнее см. Не удалось загрузить файл или сборку 'System.Private.CoreLib ...' .

...