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 :

Problème de création dynamique d'instance


Sujet :

C#

  1. #1
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut Problème de création dynamique d'instance
    Bonjour à toutes et à tous,

    Voici mon problème:j'ai une solution composée de 3 projets:
    - un programme:monProgramme.exe
    - une bibliothèque de classes:mesclasses.dll
    - une autre bibliotheque de classe: uneautrebib.dll

    J'ai besoin de créer dynamiquement certaines instances de classes à l'aide de System.Activator.CreateInstance.
    J'appelle System.Activator.CreateInstance à partir de uneautrebib.dll.
    Pour créer une instance dont la classe est déclarée dans ce namespace, pas de problème, par contre si la classe est déclarée dans mesclasses.dll ça ne fonctionne pas.
    J'utilise cette syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ObjectHandle obj=System.Activator.CreateInstance("mesclasses","maClasse");
    J'ai un message d'erreur du type
    la classe "maclasse" n'a pas été trouvée.
    La classe en question est bien présente est déclarée avec l'attribut "public" et j'ai inclus la ligne
    dans le fichier qui appelle System.Activator.CreateInstance.
    Si j'essaie l'une des deux syntaxes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ObjectHandle obj=System.Activator.CreateInstance("mesclasses.dll","maClasse");
    //ou
    obj=System.Activator.CreateInstance("chemincomplet\mesclasses.dll","maClasse");
    J'ai un message d'erreur
    file not found, impossible de charger l'assembly.
    Quelqu'un a-t-il déjà rencontré ce pb?
    7 fois à terre, 8 fois debout

  2. #2
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Et avec un échappement de caractère sur le chemin complet ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj=System.Activator.CreateInstance(@"chemincomplet\mesclasses.dll","maClasse");
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    la solution la plus propre serait que la lib devant créer le type qu'elle ne connait pas par référence reçoive le type à créer
    s'il n'y a pas de référence inverse entre les 2 dll, c'est alors l'exe qui devrait faire cette notification
    par exemple sur la lib une méthode shared qui demande le type en paramètre (en tant que system.type, à partir du type l'instanciation dynamique ne peut pas échouer pour type non trouvé )

    ca permet de garder de la vérification à la compilation
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par Er3van Voir le message
    Et avec un échappement de caractère sur le chemin complet ?
    Oui, j'y ai pensé mais ce n'est pas ça, j'ai juste fait une erreur de frappe en postant

    Le message exact lorsque je mets le nom complet est :
    FileLoadException:
    Impossible de charger le fichier ou l'assembly 'Chemincomplet\\mesclasses.dll' ou une de ses dépendances. Le nom ou le code base de l'assembly donné n'est pas valide. (Exception de HRESULT : 0x80131047)
    Je pense que c'est dû au fait que l'assembly est déjà chargé car a priori, il trouve l'assembly si j'utilise la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ObjectHandle bj=System.Activator.CreateInstance("mesclasses","maClasse");
    Le message d'erreur est alors:
    TypeLoadException:
    Impossible de charger le type 'maClasse' à partir de l'assembly 'mesclasses, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
    7 fois à terre, 8 fois debout

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Il faut juste spécifier le nom complet de la classe, avec son namespace.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Il faut ptet passer le nom en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectHandle bj=System.Activator.CreateInstance("mesclasses","maClasse, mesclasses, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

  7. #7
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Il faut ptet passer le nom en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectHandle bj=System.Activator.CreateInstance("mesclasses","maClasse, mesclasses, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
    Bien essayé mais non j'ai un message d'erreur
    il ne faut pas spécifier le nom complet
    Citation Envoyé par Pol63
    la solution la plus propre serait que la lib devant créer le type qu'elle ne connait pas par référence reçoive le type à créer
    s'il n'y a pas de référence inverse entre les 2 dll, c'est alors l'exe qui devrait faire cette notification
    par exemple sur la lib une méthode shared qui demande le type en paramètre (en tant que system.type, à partir du type l'instanciation dynamique ne peut pas échouer pour type non trouvé )
    A priori ça ne fonctionne pas. Dans mon premier post, je disais qu'il n'y a pas de problème lorsque je crée l'instance dans le bon assembly, mais c'est faux, cela ne fonctionne qu'avec la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    object obj=System.Activator.CreateInstance(monInstance.GetType());
    Si je ne connais pas le type de l'instance mais uniquement son nom, ça ne fonctionne pas avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectHandle bj=System.Activator.CreateInstance("mesclasses","maClasse");
    même si je suis dans le bon assembly.
    7 fois à terre, 8 fois debout

  8. #8
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Bonjour,

    Il faut juste spécifier le nom complet de la classe, avec son namespace.

    Bonne pioche.
    Je pensais que l'assembly en question ne contenant qu'un namespace, qui plus est du même nom que l'assembly, il était inutile de préfixer la classe.
    La bonne syntaxe est donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ObjectHandle Obj=System.Activator.CreateInstance("mesclasses","mesclasses.maClasse");
    7 fois à terre, 8 fois debout

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/02/2010, 17h49
  2. Réponses: 4
    Dernier message: 27/12/2009, 14h25
  3. problème avec création dynamique de popup
    Par Melianos dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 31/07/2008, 13h21
  4. Réponses: 3
    Dernier message: 06/02/2008, 18h11
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07

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