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 :

Reflection chargement d'assembly/type/methods


Sujet :

C#

  1. #1
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut Reflection chargement d'assembly/type/methods
    Bonjour

    Dans un projet, je dois faire du chargement dynamique d'assembly (selon un paramètre de la config), récupérer un type et exécuter une méthode.

    Je commence comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Assembly interfacedXmlCustomersLoader = Assembly.LoadFile(Properties.Settings.Default.InterfacedXmlCustomersLoaderDllPath);
                    if (interfacedXmlCustomersLoader == null)
                        throw new NullReferenceException("Impossible de charger la dll de chargement de l'objet XmlDocument. Le chemin spécifié est peut-être incorrect");
     
     
                    //Module module = interfacedXmlCustomersLoader.GetModule(Properties.Settings.Default.InterfacedXmlCustomersLoaderFullClassName);
                    //if (module == null)
                    //    throw new NullReferenceException(string.Format("Impossible de charger le module {0}", Properties.Settings.Default.InterfacedXmlCustomersLoaderFullClassName));
                    //Type[] type = module.GetTypes();
     
                    Type[] type = interfacedXmlCustomersLoader.GetTypes();
    avec comme properties.settings :
    C:/[...]/Tools.FileGetter.XmlLoader.dll
    et
    Tools.FileGetter.XmlLoader.XmlCustomersLoaderFromFile

    Lorsque j'exécute mon code j'obtiens l'erreur :
    System.Reflection.ReflectionTypeLoadException
    Impossible de charger un ou plusieurs des types requis. Extrayez la propriété LoaderExceptions pour plus d'informations.
    sur le GetTypes()

    un coup de main ?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Sans le détail de l'exception il est difficile de fournir une réponse précise, mais, une possibilité (très probable, car elle entraine en effet cette exception à coup sur) est que un des types de l'assembly que tu charges hérite d'un type d'une autre assembly qui n'est pas chargée ni réferencée dans l'assembly qui demande le chargement dynamique.

  3. #3
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Ce n'éait pas la bonne façon de procéder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                    Assembly interfacedXmlCustomersLoader = Assembly.LoadFile(Properties.Settings.Default.InterfacedXmlCustomersLoaderDllPath);
                    if (interfacedXmlCustomersLoader == null)
                        throw new NullReferenceException("Impossible de charger la dll de chargement de l'objet XmlDocument. Le chemin spécifié est peut-être incorrect");
     
                    object loaderClass = interfacedXmlCustomersLoader.CreateInstance(Properties.Settings.Default.InterfacedXmlCustomersLoaderFullClassName);
                    if (loaderClass == null)
                        throw new NullReferenceException("Impossible de récupérer l'instance de la classe de chargement");
     
                    MethodInfo methodToExecute = loaderClass.GetType().GetMethod("GetCustomersDocument");
                    if (methodToExecute == null)
                        throw new NullReferenceException("Impossible de récupérer la méthode à exécuter");
     
                    string[] param = { customerListFileFullName };
                    XmlDocument customerFile = (methodToExecute.Invoke(loaderClass, param) as XmlDocument);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Properties.Settings.Default.InterfacedXmlCustomersLoaderDllPath :
    C:/[...]/Tools.FileGetter.XmlLoader.dll (chemin complet)
     
    Properties.Settings.Default.InterfacedXmlCustomersLoaderFullClassName :
    Tools.FileGetter.XmlLoader.XmlCustomersLoaderFromFile
    Maintenant, la méthode CreateInstance me retourne Null, à priori c'est qu'il ne trouve pas la classe dans l'assembly... Bien évidemment, elle y est !

    Je ne comprends pas

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Comme tu ne nous a pas dit exactement sur quel critére tu voulais récupérer ton type, on ne peut pas savoir si c'était la bonne façon ou pas.

    Néanmoins, une chose est sure : si le GetType sur l'assembly lève une ReflectionTypeLoadException, c'est que tu as un type dans l'assembly qui hérite d'un type dans une autre assembly qui ne se trouve ni dans le GAC ni dans le répertoire de l'applicaition cliente (je me suis amusé entretemps à reproduire l'erreur et il n'y a pas le moindre doute la dessus).

    Ce type est-il celui qui t'intéresse,ça je ne sais pas.

    Quant à ton second code, si c'est le cas, il ne peut pas fonctionner non plus.

  5. #5
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    exactement, la dll de mes interfaces était absente du répertoire...
    bien

    j'avais trouvé entre temps (merci mon dsi )

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

Discussions similaires

  1. Problème de chargement d'assembly
    Par despeludo dans le forum Framework .NET
    Réponses: 2
    Dernier message: 04/04/2008, 08h42
  2. [Reflection] Opérateurs pour un type donné
    Par Mose dans le forum Framework .NET
    Réponses: 4
    Dernier message: 04/12/2006, 17h56
  3. Réponses: 5
    Dernier message: 27/01/2006, 18h48
  4. [EDI][D2005]Vitesse de chargement d'assembly au debug
    Par sur_uix dans le forum Delphi .NET
    Réponses: 4
    Dernier message: 12/12/2005, 17h49
  5. [Reflection][Bean] Appel d'une méthode dynamiquement
    Par eraim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/04/2004, 11h07

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