2 votes

Xamarin XAML: Le type n'est pas trouvé à partir de l'assembly externe

Je possède une solution Visual Studio, qui comporte 2 projets C# :

  1. une bibliothèque portable en C# nommée BasicLib ;

  2. un projet XAML portable en C#.

J'ai défini des fichiers de ressources et une classe publique LocalizedStrings dans le BasicLib. Son espace de noms est "PL.Common.BasicLib", le nom de l'assembly est "PL.Common.BasicLib.dll".

LocalizedStrings.cs

namespace PL.Common.BasicLib
{
    /// 
    /// Fournit l'accès aux ressources de chaînes.
    /// 
    public class LocalizedStrings
    {
        private static AppResources _localizedResources = new AppResources();

        public AppResources LocalizedResources { get { return _localizedResources; } }
    }
}

Ensuite, j'ai ajouté une référence depuis le projet XAML vers ce PL.Common.BasicLib. Jusque là tout va bien. Si je double-clique sur le nom de l'assembly dans le noeud "Références" du projet XAML, je peux voir le type "LocalizedStrings" sous "PL.Common.BasicLib" dans l' "Explorateur d'objets" de Visual Studio.

Maintenant, je voudrais mettre cette ressource dans App.xaml en tant que ressource d'application de cette manière :

App.xaml:

Compilation de la solution, aucun problème. Lorsque je l'exécute, une erreur se produit :

Xamarin.Forms.Xaml.XamlParseException: Position 8:6. 
Type basiclib:LocalizedStrings introuvable dans l'espace de noms xmlns clr-namespace:PL.Common.BasicLib;assembly=PL.Common.BasicLib

Quelqu'un peut-il jeter un coup d'œil où se trouve le bug?

Merci!

1voto

G.Sharada Points 11082

Cela pourrait être lié à un problème de liaison connu - où le compilateur Xamarin finit par exclure des classes (de bibliothèques externes) qui n'ont des références que dans le XAML.

Il existe quelques liens qui parlent de cela :

  1. Extensions de plugins de contrôle > Démarrage
  2. Forcer la liaison des assemblages

Il existe de nombreuses options pour résoudre ceci :

  1. Ajouter une méthode statique Init dans chaque classe comme mentionné ici dans la section "Démarrage" ici

    // cela garantit que la classe ne sera pas 
    // exclue de l'application si nous ajoutons cette bibliothèque.
    public static void Init() { }
  2. Ou, conserver le code en utilisant des attributs de préservation sur Android, et iOS

    public class Example
    {
         [Android.Runtime.Preserve]
         public Example ()
         {
         }
    }
  3. Ou, utiliser la liaison personnalisée.

  4. Ou, mettre à jour la configuration du projet pour ne pas effectuer la liaison. Android, et iOS. Cependant, ce n'est pas une option recommandée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X