IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Systeme de plugin: une dll comprenant une autre dll


Sujet :

C#

  1. #1
    Membre éprouvé
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 448
    Points : 990
    Points
    990
    Par défaut Systeme de plugin: une dll comprenant une autre dll
    Bonjour,

    J'utilise un système de plugin qui charge les dll par (en gros)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
                                    Assembly assembly = Assembly.LoadFile(absolutePath);
     
                    Type[] assemblyTypes = assembly.GetTypes();
     
                    foreach (Type type in assemblyTypes)
                    {
                        var interfaces = type.GetInterfaces();
                        if (interfaces != null && interfaces.Contains(typeof(IIHMPlugin)))
                        {
                            IHMPlugin module = new IHMPlugin((IIHMPlugin)Activator.CreateInstance(type), s);
     
                            #region Vérifications
                            if (string.IsNullOrEmpty(module.Name))
                                throw new Exception($"Plugin has Null Name on: {absolutePath}");
     
                            Test_MethodMessage(absolutePath, () => module.PluginCore);
     
                            #endregion
     
                            Debug.WriteLine(module.Name + " détecté");
     
                            return module;
                        }
                    }
    etc....

    Il se trouve que j'ai un plugin qui utilise une dll pour pas m'ennuyer à refaire certaines choses...
    Cette dll est ajoutée à mon plugin par add/reference sous visual studio et dans mon code j'appelle l'espace de nom by using.

    Or chaque fois que je l'utilise une exception est levée comme quoi il ne trouve pas la dll en question, si je la mets dans le même dossier que mon plugin il ne trouve pas, de même qu'à la racine du programme principal... Je ne sais pas où le programme cherche cette dll en plus.

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Tu peux te tourner vers AppDomain.AssemblyResolve, qui est un événement appelé lorsque la résolution d'une dépendance échoue. Tu peux alors la charger manuellement pour éviter l'erreur que tu rencontres.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre éprouvé
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 448
    Points : 990
    Points
    990
    Par défaut
    Merci pour ton aide, je vais me mettre ça au chaud quelque part ça m'aurait été énormément utile hier.

    J'ai finalement trouvé avant de passer par ici en bon acharné têtu... :/, j'ai scruter la méthode MS pour charger les plugins, j'ai fait la synthèse avec la mienne et e code modifié donne ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     PluginLoadContext loadContext = new PluginLoadContext(absolutePath);
     
                    AssemblyName aname = new AssemblyName(Path.GetFileNameWithoutExtension(absolutePath));               
     
                     Assembly assembly = loadContext.LoadFromAssemblyName(aname);
                    //Assembly assembly = Assembly.LoadFile(absolutePath);
     
                    Type[] assemblyTypes = assembly.GetTypes();
     
                    foreach (Type type in assemblyTypes)
                    {
                        var interfaces = type.GetInterfaces();
                        if (interfaces != null && interfaces.Contains(typeof(IIHMPlugin)))
                        {
                            IHMPlugin module = new IHMPlugin((IIHMPlugin)Activator.CreateInstance(type), s);
     
                            #region Vérifications
                            if (string.IsNullOrEmpty(module.Name))
                                throw new Exception($"Plugin has Null Name on: {absolutePath}");
     
                            Test_MethodMessage(absolutePath, () => module.PluginCore);
     
                            #endregion
     
                            Debug.WriteLine(module.Name + " détecté");
     
                            return module;
                        }
    Le pluginloadcontext dérive de la classe abstraite AssemblyLoadContext

    https://docs.microsoft.com/fr-fr/dot...ew=netcore-3.1

    https://docs.microsoft.com/fr-fr/dot.../unloadability

    J'ai lu tard hier soir, je saurais pas trop bien retranscrire du coup que c'était assez compliqué de charger des plugins qui ont des dépendances, sans passer par ça, du coup j'ai un peu adapté.

    Au cas ou quelqu'un tombe sur ce post avec le même problème que moi "Test_MethodMessage" pas de quoi fouetter un chat c'est une méthode qui teste les propriétés des plugins, pour voir si cela ne renvoie pas une erreur de non implémentation ou une chaine nulle. Du coup ça empêche le chargement du plugin si c'est le cas pour éviter de futurs bugs. Je le laisse du coup si c'est utile ou bien s'il existe mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
     
        /// <summary>
            /// 
            /// </summary>
            /// <param name="pluginName"></param>
            /// <param name="module"></param>
            /// <param name="p"></param>
            /// <remarks>
            /// Note: Récupère le nom de la propriété utilisée 
            /// </remarks>
            private static void Test_MethodMessage(string pluginName, Expression<Func<string>> p)
            {
                try
                {
                    Func<string> func = p.Compile();
     
                    if (string.IsNullOrEmpty(func()))
                        throw new Exception($"Null value");
                }
                catch (Exception e)
                {
                    var member = p.Body as MemberExpression;
                    PropertyInfo propInfo = member.Member as PropertyInfo;
     
                    throw new Exception($"Problem on Plugin: '{pluginName}' | Property: '{propInfo.Name}' \r\n\t{e.Message}");
                }
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/06/2007, 17h52
  2. creation d'une dll appelant une autre librairie
    Par nezdeboeuf62 dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2007, 10h22
  3. Instancier une classe comprenant une autre classe
    Par jymmy dans le forum Général VBA
    Réponses: 2
    Dernier message: 17/11/2006, 12h33
  4. une Dll peut elle utiliser les fonctions d'une autre dll?
    Par kantelise dans le forum Windows
    Réponses: 7
    Dernier message: 18/05/2006, 03h45
  5. Réponses: 3
    Dernier message: 16/06/2004, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo