Почему мой Xamarin PCL бросает исключение во время выполнения при создании версии для Universal App?

У меня есть xamarin PCL, который отлично работает в режиме отладки x86. Когда я переключу его в режим Release (x86 или x64) или x64 Debug, я получаю исключения во время выполнения. Вероятно, это относится к

https://forums.xamarin.com/discussion/57810/issue-with-xamarin-forms-in-windows-uwp-app-compiled-in-the-release-mode

но я не знаю, какую другую сборку я использую. Как я могу сказать?

Мой компьютер - x64. Когда я запускаю x64 в отладке или выпуске, я получаю

Исключение "System.NotImplementedException" в MyApp.Interop.dll. Дополнительная информация Arg_NotImplementedException.

Перед вводом конструктора App(). Вызов конструктора находится здесь:

LoadApplication(new MyApp.App());

Когда я создаю x86, я получаю немного дальше. Он попадает в MyAppConstructor и вызывает конструктор xaml и дает исключение:

System.Reflection.MissingMetadataException в System.Private.Reflection.Core.dll Дополнительная информация: Arg_InvokeMethodMissingMetadata, System.EventHandler. Для получения дополнительной информации посетите http://go.microsoft.com/fwlink/?LinkId=623485

Итак, это похоже на сборку Xaml, которую я пропускаю. Как узнать, какую сборку мне нужно добавить?

Я вернул его в Debug, но перевел его на "использовать собственный компилятор", чтобы получить более подробную информацию об исключениях:

x86: Дополнительная информация: Невозможно создать делегат в типе "System.EventHandler", так как отсутствует метаданные для метода Invoke. Для получения дополнительной информации посетите http://go.microsoft.com/fwlink/?LinkID=616867

64: Исключение типа "System.NotImplementedException" произошло в Xamarin.Forms.Platform.UAP.dll, но не было обработано в коде пользователя

Дополнительная информация: Метод или операция не реализованы.

UPDATE: Я предполагаю, что x64 не поддерживается в Xamarin, потому что у мобильного устройства нет процессора x64? Все еще оставляет проблему с выпуском x86. Я попытался добавить следующие сборки в свой Universal App.xaml.cs

  List<Assembly> assembliesToInclude = new List<Assembly>();
  assembliesToInclude.Add(typeof(MyApp.MyAppMainPage).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.ImageSource).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.StackLayout).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.Label).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.Button).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.FormattedString).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.Span).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.Image).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.ScrollView).GetTypeInfo().Assembly);
  assembliesToInclude.Add(typeof(Xamarin.Forms.WebView).GetTypeInfo().Assembly);
  // add this line
  Xamarin.Forms.Forms.Init(e,assembliesToInclude); // requires the `e` parameter

где MyAppMainPage - это страница xaml, которую я пытаюсь загрузить в моем PCL, а остальные элементы интерфейса, на которых состоит страница.

Теперь я вижу это исключение для x86:

'System.PlatformNotSupportedException' в System.Private.Interop.dll Исключение выбрано: "System.AggregateException" в System.Private.Threading.dll Исключение выбрано: "System.Reflection.MissingMetadataException" в System.Private.Reflection.Core.dll

Почему платформа не будет поддерживаться? Xamarin поддерживает универсальное право?

Ответы

Ответ 1

Я добавил файл директив. Добавьте файл с завершением .rd.xml. Мой был MyApp.rd.xml. Затем включите типы, о которых говорит исключение. Мой был System.EventHandler. Вот мой код (вам, вероятно, не нужны два других).

<?xml version="1.0" encoding="utf-8"?>
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
  <Type Name="MyApp.MyAppMainPage" Dynamic="Required All" /> 
  <Type Name="System.EventHandler" Dynamic="Required All" /> 
  <Namespace Name="System.Private.Reflection.Core" Serialize="Required All" />
</Application>
</Directives> 

Я полагаю, что в Universal Apps для Xamarin вам нужно включить сборку при загрузке встроенных ресурсов. Мне пришлось изменить

ImageSource.FromResource("MyApp.Images.Sign.jpg");

to

var assembly = typeof(MyAppMainPage).GetTypeInfo().Assembly;
ImageSource.FromResource("MyApp.Images.Sign.jpg",assembly);

Вы можете проверить, какие у вас ресурсы есть

foreach (var res in assembly.GetManifestResourceNames())
  System.Diagnostics.Debug.WriteLine("found resource: " + res);

x64 все еще сломан.