Répondre au problème d’affichage des contrôles Xamarin.Forms sur les applications UWP

Lorsque vous développez des applications Windows 10 (UWP) par l’intermédiaire de Xamarin.Forms et que vous compilez en release ou que vous publiez vos applications sur le store l’option « Compiler avec la chaîne de l’outil du code natif » (ou « Compile with .NET Native tool chain » en anglais) est activée afin d’améliorer les performances de votre application. Lorsque cette option -obligatoire pour la publication sur le store- est active, il peut arriver que Xamarin.Forms ne parvienne pas à charger les éléments de certaines assemblies, en particulier les classes de rendu. Vous pouvez par exemple être confronté à une carte qui ne s’affiche pas sur l’application publiée ou à une levée d’exceptions lors de l’instanciation de la carte si vous êtes en release dans Visual Studio.

L’article « Adding a Universal Windows Platform (UWP) App » de la documentation officielle Xamarin détaille la solution de contournement :

Target Invocation Exception » when using « Compile with .NET Native tool chain »
If your UWP app is referencing multiple assemblies (for example third party control libraries, or your application itself is split into multiple PCLs), Xamarin.Forms may be unable to load objects from those assemblies (such as custom renderers).

This might occur when using the Compile with .NET Native tool chain which is an option for UWP apps in the Properties > Build > General window for the project.

You can fix this by using a UWP-specific overload of the Forms.Init call in App.xaml.cs as shown in the code below (you should replace ClassInOtherAssembly with an actual class your code references):

// you'll need to add `using System.Reflection;`
List assembliesToInclude = new List();

//Now, add in all the assemblies your app uses
assembliesToInclude.Add(typeof (ClassInOtherAssembly).GetTypeInfo().Assembly);

//Also do this for all your other 3rd party libraries

Xamarin.Forms.Forms.Init(e, assembliesToInclude);
// replaces Xamarin.Forms.Forms.Init(e);
Add a reference to each assembly that is referenced by the app.

Dependency Services and .NET Native Compilation
Release builds using .NET Native compilation can fail to resolve dependency services that are defined outside the main app executable (such as in a separate project or library).

Use the DependencyService.Register() method to manually register dependency service classes. Based on the example above, add the register method like this:

Xamarin.Forms.Forms.Init(e, assembliesToInclude);
Xamarin.Forms.DependencyService.Register(); // add this

Pour continuer sur l’exemple de la carte, la classe à cibler est Xamarin.Forms.Maps.UWP.MapRenderer et non Xamarin.Forms.Maps.Map. La solution qui fonctionne est donc la suivante :

using System.Reflection;

var rendererAssemblies = new []
{
    typeof(Xamarin.Forms.Maps.UWP.MapRenderer).GetTypeInfo().Assembly
};

Xamarin.Forms.Forms.Init(e, rendererAssemblies);

Source : Forums Xamarin

Vous trouverez plus d’informations sur les articles MSDN « Compilation d’applications avec .NET Native » et « Prise en main de .NET Native »

Facebooktwitterlinkedinmail

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.