Проект Xamarin не может найти SkiaSharp в Android или Windows

Признаюсь, я новичок в Xamarin и кроссплатформенной разработке, поэтому извиняюсь, если это кажется тривиальным вопросом, но я пытался разобраться в нем уже несколько вечеров.

У меня есть базовое приложение Xamarin Forms, которое работает в Windows 8.1, Windows UWP и Android. Он использует SkiaSharp для некоторой базовой графики (на основе примера Skia).

Он работал на всех трех платформах, но мне пришлось удалить и повторно добавить пакеты Xamarin в проект, и я больше не могу заставить SkiaSharp правильно работать в Windows или Android. Я получаю исключение BadImageFormatException:

Additional information: Could not load file or assembly 'SkiaSharp, Version=1.56.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)

Я получаю это исключение в конфигурациях x86, x64 и Any CPU для версии Windows 8.1, а также в версии Android.

Если я запустил проект UWP, он работает отлично.

Соответствующая структура проекта:

  • MyProj.XMForms (Portable) - PCL, содержащий основное приложение Xamarin.Forms, MainPage с StackLayout, содержащий фрейм с MyView, и MyView, содержащий сетку с SKCanvasView.
  • MyProj.Windows (Windows 8.1) - оболочка - просто содержит пустое приложение и страницу MainPage, которая загружает приложение MyProj.XMForms.
  • MyProj.UWP (универсальная Windows) - оболочка - просто содержит пустое приложение и страницу MainPage, которая загружает приложение MyProj.XMForms.
  • MyProj.Droid (Android) - оболочка - просто содержит MainActivity, который загружает приложение MyProj.XMForms.

Все пакеты NuGet проектов имеют Xamarin.Forms 2.3.3.180, SkiaSharp 1.56.0 и SkiaSharp.Views.Forms 1.56.0. MyProj.Droid также имеет SkiaSharp.Views (никто из остальных не примет его).

Я обнаружил https://github.com/mono/SkiaSharp/issues/190 и добавил <ShouldIncludeNativeSkiaSharp>true</ShouldIncludeNativeSkiaSharp> в csproj без каких-либо изменений.

Я попытался удалить и повторно добавить пакеты NuGet SkiSharp.

Что мне не хватает?

Спасибо,

Ян


person Ian Brockbank    schedule 30.01.2017    source источник


Ответы (2)


Если вы посмотрите на сообщение об исключении, там будет такая строка:

Эталонные сборки не должны загружаться для выполнения.

Это означает, что вы не установили SkiaSharp NuGets в проекты приложений. Убедитесь, что во всех приложениях установлены SkiaSharp, SkiaSharp.Views и SkiaSharp.Views.Forms NuGets. Основному проекту нужны только SkiaSharp и SkiaSharp.Views.Forms NuGets.

Кроме того, Windows 8.x в настоящее время не поддерживается из-за ограничения в Skia: https://github.com/mono/SkiaSharp/issues/20.

person Matthew    schedule 06.02.2017
comment
Спасибо. Полезно иметь подтвержденный список зависимостей. К сожалению, это не был ответ для меня - я уже трижды проверил, а затем перепроверил проект Android из SkiaSharp FormsSample - у меня определенно уже был точно такой же набор Nugets. - person Ian Brockbank; 13.02.2017
comment
Полезно знать об ограничении Windows 8 - мне было интересно, почему не было образца для этого, когда Xamarin Forms его поддерживал. Для меня действительно академический, так как я планирую использовать собственные формы Windows для обычных компьютеров с Windows, но меня это беспокоило ... - person Ian Brockbank; 13.02.2017

Хорошо, мне удалось заставить Android работать, взяв проект Android из SkiaSharp FormsSample и заменив вызов на

LoadApplication(new SkiaSharpSample.FormsSample.Platform.App());

с участием

LoadApplication(new MyPortable.XamarinForms.App());

Мой исходный проект определенно включал в себя все те же NuGets, что и этот, и я еще не определил их ключевое различие, что означало, что этот работал, а мой нет, но, по крайней мере, теперь у меня есть решение, которое работает как в Android, так и в UWP. .

person Ian Brockbank    schedule 12.02.2017