c# xamarin assemblies release uwp

c# - ¿Por qué mi PCL de Xamarin lanza una excepción de tiempo de ejecución al crear la versión para Universal App?



assemblies release (1)

Tengo un PCL xamarin que funciona bien en el modo de depuración x86. Cuando lo cambio al modo de lanzamiento (x86 o x64) o x64 Debug, obtengo excepciones de tiempo de ejecución. Probablemente se relaciona con

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

pero no sé qué otro conjunto estoy usando. ¿Cómo puedo decir?

Mi computadora es x64. Cuando ejecuto x64, ya sea en depuración o lanzamiento, obtengo

Excepción "System.NotImplementedException" en MyApp.Interop.dll. Información adicional Arg_NotImplementedException.

Antes de entrar en la aplicación del constructor (). La convocatoria al constructor está aquí:

LoadApplication(new MyApp.App());

Cuando construyo x86 llego un poco más lejos. Entra en el MyAppConstructor y llama al constructor xaml y da una excepción:

System.Reflection.MissingMetadataException en System.Private.Reflection.Core.dll Información adicional: Arg_InvokeMethodMissingMetadata, System.EventHandler. Para obtener más información, visite http://go.microsoft.com/fwlink/?LinkId=623485

Así que parece que me falta un ensamblado de Xaml. ¿Cómo averiguo qué ensamblaje necesito agregar?

Lo puse de nuevo en Debug, pero lo cambié a "usar el compilador nativo" para poder obtener más detalles sobre las excepciones:

x86: Información adicional: No se puede crear un delegado en el tipo ''System.EventHandler'', ya que faltan metadatos para el método Invoke. Para obtener más información, visite http://go.microsoft.com/fwlink/?LinkID=616867

x64: se produjo una excepción del tipo ''System.NotImplementedException'' en Xamarin.Forms.Platform.UAP.dll pero no se manejó en el código de usuario

Información adicional: El método u operación no está implementado.

ACTUALIZACIÓN: supongo que x64 no es compatible con Xamarin porque ningún producto móvil tiene procesador x64. Todavía deja el problema con la versión x86. He intentado agregar los siguientes ensamblados en mi 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

donde MyAppMainPage es la página xaml que trato de cargar en mi PCL y el resto son los elementos de la interfaz de usuario que forman la página.

Ahora veo esta Excepción lanzada para x86:

''System.PlatformNotSupportedException'' en System.Private.Interop.dll Excepción lanzada: ''System.AggregateException'' en System.Private.Threading.dll Excepción lanzada: ''System.Reflection.MissingMetadataException'' en System.Private.ReflectionCore.com

¿Por qué no se soportaría la plataforma? Xamarin soporta Universal ¿verdad?


He añadido un archivo de directivas. Agrega un archivo con la terminación .rd.xml. El mío fue MyApp.rd.xml. Luego incluya los tipos que la excepción dice que faltan. El mio fue System.EventHandler. Aquí está mi código (probablemente no necesite los otros dos).

<?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>

Supongo que en Universal Apps para Xamarin debe incluir el ensamblaje al cargar recursos incrustados. Tuve que cambiar

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

a

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

Puedes comprobar qué recursos tienes por

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

x64 sigue roto.