Почему мой 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 все еще сломан.