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 :

Impossible de trouver l'assembly (chargement dynamique de DLL)


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2004
    Messages : 47
    Points : 36
    Points
    36
    Par défaut Impossible de trouver l'assembly (chargement dynamique de DLL)
    Bonjour,

    J'ai une application qui charge dynamiquement des dll (plugin) d'après une liste dans un fichier.
    Le chargement se fait via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Assembly.LoadFrom(@plugInFolder + "\\" + dllName);

    La dll apparaît bien lorsque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AppDomain.CurrentDomain.GetAssemblies()

    Puis je désérialize un fichier qui utilise cette assembly (Binary) et j'obtient l'erreur suivante :
    Impossible de trouver l'assembly '...'

    Je ne comprend pas,

    Est-ce que quelqu'un pourrait m'aider.

    Merci

    Vincnet68

  2. #2
    Invité
    Invité(e)
    Par défaut
    Si j'étais toi je commencerais d'abords par vérifier que la dll concernée existe vraiment avant d'appeler la ligne : Assembly.LoadFrom(@plugInFolder + "\\" + dllName);Peut-on voir le code où ça plante (la partie du code qui est censée utilisée le ou les types présents dans l'assembly) ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2004
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Elle est bien affichée quand je fait "GetAssemblies()" donc il l'a trouve bien, non ?

    Ca plante ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//null, context);
                        importedFile = formater.Deserialize(stream) as ITool;

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2004
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    En continuant mes recherches je suis tombé sur un article qui disait que la DLL devait être à la racine du répertoire, ça marche si je la met ici.

    Donc comment puis-je faire pour que mon programme aille chercher la dll dans un autre répertoire lors de la désérialisation ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par vincnet68 Voir le message
    Impossible de trouver l'assembly '...'
    Mais bon avec ce message d'erreur on ne peut que dire que l'application ne l'a tout simplement pas trouvé. Regarde dans le InnerException peut-être qu'il y a des détails.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2004
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Sauf que s'il est chargé (GetAssemblies) c'est qu'il l'a trouvé à un moment.

    Sais-tu comment on peut changer l'emplacement de recherche des DLL lors de la désérialisation ?

    Merci

  7. #7
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Si la dll se trouve ailleurs, sois tu l'inscris dans le GAC soit tu passes par l'événement AssemblyResolve de ton AppDomain

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
       AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
       ...
     
    System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
       return Assembly.LoadFrom("chemin complet de la dll.dll"));
    }

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2004
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse.

    Voilà ce que je fait :
    Chargement de la dll
    Code cs : Sélectionner tout - Visualiser dans une fenêtre à part
    Assembly assembly = Assembly.LoadFrom(@plugInFolder + "\\" + dllName);

    Ajout dans program.cs
    Code cs : 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
     
    static void Main()
    {
     //.......
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    //........
    }
     
    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                string dllFile = args.RequestingAssembly.ManifestModule.Name;
                if (System.IO.File.Exists(PlugInFolder + args.Name))
                    return Assembly.LoadFrom(PlugInFolder + dllFile);
                else 
                    return Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + "\\" + dllFile);
     
            }
    Au vu de ce que donne args.RequestingAssembly.ManifestModule.Name je suis étonné que cela fonctionne mais ça marche.

    J'espère que ça pourra servir à quelqu'un.

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

Discussions similaires

  1. Impossible de trouver l'assembly
    Par r0seBa dans le forum C#
    Réponses: 0
    Dernier message: 12/09/2011, 13h10
  2. Réponses: 1
    Dernier message: 05/11/2009, 11h09
  3. [VB.NET] Chargement dynamique des dlls de l'application
    Par leSeb dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/01/2006, 17h49
  4. [MFC VC.NET] Chargement dynamique de DLL
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 26/01/2005, 13h56
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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