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 :

[C# 2.0] Comment charger une assembly dynamiquement ?


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2005
    Messages : 38
    Points : 40
    Points
    40
    Par défaut [C# 2.0] Comment charger une assembly dynamiquement ?
    Bonjour,

    voilà mon problème. Mon objectif est de pouvoir charger une Assembly dont le nom est dans un fichier de config : App.config.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="data" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </configSections>
     
      <data>
        <add key="AssemblyLongFormName" value="Pape02.DataAccess, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <add key="ClassName" value="Pape02.DataAccess.Factory" />
        <add key="Singleton" value="Instance" />
      </data>
    </configuration>
    Ci-dessous mon code pour charger mon Assembly :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                    //récupère les informations du fichier de configuration
                    NameValueCollection dico = (NameValueCollection)ConfigurationManager.GetSection("data");
                    //charge l'assembly
                    Assembly assemb = Assembly.Load(dico["AssemblyLongFormName"].ToString());
                    //récupère le type
                    Type type = assemb.GetType(dico["ClassName"].ToString());
                    //récupère la propriétés
                    PropertyInfo prop = type.GetProperty(dico["Singleton"].ToString());
                    //retourne le singleton
                    return (IDataAccessFactory)prop.GetGetMethod().Invoke(null, null);
    Je précise que l'erreur se situe à la commande Assembly.Load.
    L'erreur est "La référence d'objet n'est pas définie à une instance d'un objet"

    Merci d'avance pour votre aide.

    Damien

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 60
    Points
    60
    Par défaut
    Slt!

    Premièrement, ton exception est lancée car la condition suivante est vraie lorsque tu appelles Assembly.Load:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico["AssemblyLongFormName"] = null;
    Pour régler ça, je te propose:
    1) Utilise cette ligne dans ton web.config
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <section name="data" type="System.Configuration.DictionarySectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    2) Remplace la première ligne de ton code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Hashtable dico = ConfigurationManager.GetSection("data") as Hashtable;

  3. #3
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    en plus de l'erreur mentionné au dessus, tu ne créer à aucun moment un objet ...

    je te propose la lecture de ces articles qui t'aideront à mieux comprendre :

    - Introduction à la réflexion

    - Developper une app modulaire

    - Utilisation des appdomains

    Les deux derniers vont plus loin que ce que tu veux mais c'est toujours intéréssant
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  4. #4
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2005
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Merci beaucoup les gars pour votre aide, je teste et regarde ça illico.

    Grand merci.

    Damien

  5. #5
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2005
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Et m... alors !
    Maintenant il ne me charge pas mon assembly !

    "Impossible de charger le fichier ou l'assembly 'Pape02.DataAccess, Version 1.0.0.0, Culture=neutral, PublicKeyToken=null' ou une de ses dépendances. Le fichier spécifier est introuvable"

    Pourtant mon assembly "Pape02.DataAccess" est dans même solution que mon projet "Pape02.Service" (projet essayant de charger cette maudite assembly).

    Pour info, structure de mon projet Pape02.DataAccess :
    il est composé du fichier Factory.cs. Celui comportant la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Factory : IDataAccessFactory
    {
    ...
    }
    Quelque chose m'aurait-il échappé ? Merci d'avance pour votre aide.

    Damien

  6. #6
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Le numéro de version peut etre ...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 60
    Points
    60
    Par défaut
    Ou alors, ton DLL n'est pas au bon endroit. Il doit se trouver dans le dossier d'où tu lances ton programme (généralement /bin/debug), pas à la racine ton projet.

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

Discussions similaires

  1. Comment charger une DLL win32 en C# de manière dynamique
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 4
    Dernier message: 10/06/2009, 18h38
  2. [C#] Comment exécuter une instruction dynamiquement ?
    Par NeoMan dans le forum Contribuez
    Réponses: 11
    Dernier message: 15/01/2009, 16h45
  3. Comment générer une image dynamiquement ?
    Par K20 dans le forum Langage
    Réponses: 12
    Dernier message: 19/11/2005, 01h27
  4. Réponses: 5
    Dernier message: 13/10/2005, 10h49
  5. [MDI] Comment charger une Form fille au démarrage ?
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 13
    Dernier message: 03/07/2004, 12h40

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