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

Windows Forms Discussion :

Activator.CreateInstance = "vraie" nouvelle instance ?


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 32
    Par défaut Activator.CreateInstance = "vraie" nouvelle instance ?
    Bonjour à tous.

    J'ai créé une application qui permet l'utilisation de modules de sauvegarde, chaque module enregistrant les données manipulées dans l'appli dans un format différent.

    Pour charger un module, j'utilise la méthode Activator.CreateInstance.

    Je charge le module par défaut choisi par l'utilisateur au démarrage de l'application, et aucun autre.

    Lorsque je souhaite ouvrir un fichier existant en utilisant un module différent de celui par défaut, tout va bien.

    Mais lorsque je souhaite ouvrir un fichier existant en utilisant le même module que celui actuellement utilisé dans l'application, un problème bizarre se produit.

    Là encore, j'utilise Activator.CreateInstance. Logiquement, une nouvelle instance du module devrait être créée, non ?

    En fait, lors de l'ouverture d'un fichier, en mettant des points d'arrêt un peu partout, je m'aperçois que le module est bien chargé avec des paramètres spécifiques (le chemin vers le fichier à ouvrir, notamment).

    Seulement voilà, après chargement des données, je me rends compte que ces dernières sont les mêmes que celles chargées par le module par défaut... Alors que le chemin de fichier à charger est bien celui attendu.

    J'aimerais donc savoir comment je peux ouvrir un fichier en utilisant le même module que celui utilisé par l'application, en étant assuré qu'il s'agira bien d'une nouvelle instance de ce module.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    j'ai du mal à comprendre avec l'histoire des modules (qui sont des objets apparement). Mais Activator.CreateInstance(String) ou (Type) créé un nouvel du type donné en appellant le constructeur par defaut, ce sera forcement une nouvelle instance, oui.

    Peut on avoir un peu de code, principalement pour voir comment tu créés ces instances ? =)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 32
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string className = Path.GetFileNameWithoutExtension(fullPath);
     
    Assembly moduleAssembly = Assembly.LoadFile(fullPath);
    Type moduleType = moduleAssembly.GetType(className + ".Module");
     
    ISavingModule module = (ISavingModule)Activator.CreateInstance(moduleType);
    Rien de sorcier, je suis à la lettre les exemples de la MSDN.

    J'ai ce bout de code dans une méthode que j'ai appelé LoadModule, et qui me renvoit un ISavingModule

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Dans ce cas, module sera bien un nouveau ISavingModule.

    Tu dois avoir un probleme dans le cheminement du module, qui doit à un moment donné ne pas etre assigné quelque part et le module par defaut reste celui chargé. Si ton module se créé correctement et charge correctement ses données, le probleme se situe ailleurs dans ton code et pas au niveau des create instance.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 32
    Par défaut
    Non justement il ne charge pas correctement les données.

    J'ai mis des points d'arrêts aux moments cruciaux. Chaque module contient des options. Une fois le module chargé, je vois bien que le chemin de fichier à charger est le bon dans ces options. La ligne suivante, j'appelle la méthode qui charge les données (cette méthode est spécifique à chaque module), et c'est juste après cette ligne que je vois que les données chargées sont les mêmes que les données actuellement utilisées par l'appli.

    Un ti schéma peut-être pour comprendre l'organisation de mon appli ?

    Interface ISavingModule :
    object Options; => Une classe de base avec accesseurs/mutateurs non définis par une interface, et dont les membres sont spécifiques au module
    void LoadDatas(); => Charge les données

    quand je charge un module, j'utilise Activator.CreateInstance, je charge les options du module, puis je lance LoadDatas(). Le contenu de cette méthode est propre à chaque module.

    Pour charger les données, le module a besoin d'options (ne serait-ce que pour le chemin vers le fichier à charger). J'ai donc une méthode LoadOptions que j'appelle avant tout le reste (là encore,le contenu de cette méthode est propre à chaque module).

    Jusque là, les options se chargent sans problème, et, encore une fois, c'est le chemin de fichier attendu qui se trouve dans la propriété Filename.

    Suite à ça je balance donc ma méthode LoadDatas. Dans cette méthode, quoiqu'il arrive, les données sont censées être chargées depuis le fichier spécifié dans la propriété Filename. Celle-ci n'est pas modifiable directement puisque les membres de la classe Options ne sont pas prédéfinis dans une interface.

    Donc en toute logique les données chargées devraient être celle du fichier spécifié dans les options.

    Ben non ^^

    J'espère avoir été plus clair sur la structure de la couche données de mon appli.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    oui, ca commence à s'eclaircir. Donc si on resume, l'etat de ton objet est bon (ton module possede le bon set d'options avec, principalement, le bon filename qui va bien), mais suite à l'appel de la methode Load(), le fichier chargé n'est pas le bon. Donc en toute logique, on peut raisonnablement penser qu'il y a un probleme au moment de la lecture concrete du fichier (le fichier ouvert est il le bon ? (non, normalement, d'ou le probleme) Est ce qu'il existerait un set d'options par defaut que le module pourrait utiliser ?).

    De meme, en mettant en parallele avec le fait qu'apparement ceci ne se produit que quand tu utilises le module actuellement chargé sur un nouveau fichier, est ce que c'est bien la nouvelle instance créé qui est utilisée pour charger les données ? Je vois bien l'erreur : J'instancie un nouveau module, je charge mes options (tout va bien jusque la), mais au moment de charger les données, c'est sur "l'ancien module" qu'on appelle Load() et pas sur le nouveau (genre une variable pas assgné avec le nouveau module, ce dernier partant dans les choux, et l'ancien etant reutilisé).

    En esperant que ca t'aide un peu, mais sans code, je ne peux qu'emettre des hypotheses. =p

    Bon courage.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/02/2007, 19h55

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