Une petite différence entre .Net native et .Net
Hier, je me suis confronté à un bug en .Net Native, sur un code qui s'éxecute parfaitement en .Net.
Voici le code qui est interprété différemment :
public class MaClasse { public MaClasse(int a) { A = a; } public int A { get; set; } }
Comment fonctionne la version . Net ?
- Lors de la désérialisation : Newtownsoft, va rechercher un constructeur vide pour créer l'instance de MaClasse.
- Il n'en trouve pas, du coup il prend le constructeur avec un argument.
Comment fonctionne la version . Net Native ?
- Lors de la désérialisation : Newtowsoft, va rechercher un constructeur vide pour créer l'instance de MaClasse.
- Il n'en trouve pas, du coup, il recherche un autre constructeur, il n'en trouve pas, il lève donc une exception.
Que s'est-il passé ?
Lors de la compilation en .Net Native le compilateur analyse toutes les méthodes, les méthodes non utilisées sont automatiquement supprimées par le compilateur.
De ce fait, lors de la déserialisation de l'objet il ne peut plus recréer celui-ci.
Comment résoudre ce problème ?
La premiere solution la plus rapide et la plus simple est d'ajouter un constructeur vide à la classe.
La seconde, est de modifier le fichier rd.xml de l'application pour préciser au compilateur de ne pas supprimer des membres de ma classe.
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> <Application> <!-- Précise que tout les types de ce namespace doivent être conservé--> <Namespace Name="LeNameSpaceDeMaClasse" Serialize="Required Public" /> </Application> </Directives>
Happy Coding :D
Commentaires