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 :

Passage ToolStripMenuItem entre différent AppDomain


Sujet :

C#

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 256
    Points : 290
    Points
    290
    Par défaut Passage ToolStripMenuItem entre différent AppDomain
    Bonjour à tous,

    Je souhaiterais pouvoir passer un object ToolStripMenuItem d'un domaine à l'autre. Lors de la récupération de celui-ci tout va bien à prioris mais lors de l'utilisation j'obtient cette erreur:
    Une exception non gérée du type 'System.Runtime.Serialization.SerializationException' s'est produite dans System.Windows.Forms.dll

    Informations supplémentaires : Le type 'System.Windows.Forms.PropertyStore' dans l'assembly 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' n'est pas marqué comme sérialisable.
    Je vais quand même vous expliquez mon objectif et comment je l'effectue.

    Tout d'abord j'ai 3 classes dans 2 projets différents.

    Dans le projet principal j'ai une classe toute simple qui n'est rien d'autre qu'un formulaire winforms qui va créer un nouveau AppDomain et charger dans celui-ci une classe Loader. La classe Loader va me servir à charger une dll externe (un plugin) qui contient la 3ème classe se trouvant dans le second projet.

    Dans ce second projet la classe a 2 fonctions:
    - Retourner le nom du plugin (qui en réalité est un champs)
    - Retourner un objet menu
    et utilise également l'interface IPlugin

    Pour faire fonctionner tout ça, toutes les classes se trouvant dans le nouveau AppDomain sont dérivée de MarshalByRefObject qui est obligatoire (sauf si on sérialise mais chez moi cella ne fonctionne pas).

    La classe Loader contient également une fonction LoadPlugin qui renvoie une interface IPlugin.

    Lorsque dans mon formulaire principal j'effectue ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IPlugin plugin = Loader.LoadPlugin("pluginName");
    string name = plugin.Name; // fonctionne
    MessageBox.Show("Plugin name: " + name); // fonctionne
    ToolStripMenuItem mnu = plugin.GetMenu(); // fonctionne (je ne suis pas sur de recevoir un object correct mais la ligne de code fonctionne)
    MenuStrip1.DropDownItems.Add(mnu); // sur cette ligne-ci l'erreur ci-dessus s'affiche
    Merci d'avance pour votre aide

    Bonne journée

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonsoir,

    Lorsque tu exécutes l'appli en débug les valeurs contenu dans mnu sont-elles correct ?
    Ensuite pourquoi est-ce la dll2 qui qui te renvois le menu ? Il ne serai pas plus simple de créer un menuItem dans le projet principal lorsque tu tentes de charger une dll plug-In ?
    Une toute dernière question, comment charges-tu la dll ? expliquer ce que fait la méthode Loader.LoadPlugin("pluginName"); ?

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 256
    Points : 290
    Points
    290
    Par défaut
    Tout d'abord merci de votre réponse.

    Lorsque j'exécute l'application en mode debug les valeurs sont correctes sans vraiment l'être. En fait c'est un "proxy" (je pense que c'est le terme exact) qui s'affiche lors du passage de la souris sur l'élément après un breakpoint mais lorsqu'un utilise la valeur cela ne fonctionne pas. Bien sur ça parrait logique mais pourtant c'est le même comportement avec la variable plugin et la je peux appeler les champs et les méthodes comme je le souhaite.

    Et bien la dll2 est en réalité un plugin externe au programme et je souhaiterais qu'elle puisse ajouter autant de menu qu'elle souhaite à partir d'un endroit spécifique dans le programme hôte. Pour ce faire je pensais faire que l'hôte appele la fonction GetMenu du plugin qui lui va renvoyer un objet ToolStripMenuItem à l'hôte mais déjà remplis avec tous les sous-menu et tous les événements liés égalements. Je ne vois pas trop comment faire autrement pour cela.

    Pour la fonction LoadPlugin voici le code actuel:
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    // Remarque: Cette fonction est contenue dans la classe Loader qui elle est chargée dans un AppDomain différent
            public IPlugin LoadPlugin(string name)
            {
                object obj = null;
     
                try
                {
                    obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap(name, name + ".Initialize");
                }
                catch (FileNotFoundException ex) // Plugin not found
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    return null;
                }
                catch (TypeLoadException ex) // Initialize class not found
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    return null;
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    return null;
                }
     
                // check if the Initialize method is derived from MarshalByRefObject
                if (!(obj is MarshalByRefObject))
                    return null;
     
                // check if the Initialize method import IPlugin interface
                if (!(obj is IPlugin))
                    return null;
     
                plugin = (IPlugin)obj;
     
                return plugin;
            }

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Je ne connais pas la méthode :
    AppDomain.CurrentDomain.CreateInstanceAndUnwrap();
    Cependant vu l'erreur il est clair que l'objet ToolStripMenuItem ne peut pas être passé de cette façon. A mon avis parce-que c'est un objet "graphique".
    C'est pour ça que je te posais la question
    Ensuite pourquoi est-ce la dll2 qui qui te renvois le menu ?
    .
    Si tu arrive à instancier un IPlugin, tu devrais créer une méthode Execute();
    Lorsque tu charge une dll, ton main project crée ton MenuItem, tu peux à ce moment là router un évènement qui te permettra d'exécuter l'ensemble de l'implémentation du plug-In.
    Je n'ai peut être pas saisie toute ta problématique il vaut mieux séparer graphique et implémentation, tu auras moins de problème.
    Rien ne t’empêche de décrire dans ton interface IPlugin une représentation objet des menus et sous menus.
    Je sais que je ne répond pas correctement à ta question mais l'erreur que tu as est assez explicite pour modifier légèrement la façon de procéder je pense.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 256
    Points : 290
    Points
    290
    Par défaut
    La méthode AppDomain.CurrentDomain.CreateInstanceAndUnwrap(); est semblable à AppDomain.CurrentDomain.CreateInstance(); sauf que au lieu de renvoyer un handleObject, elle renvoie directement l'objet. Ces méthodes charge l'assembly en mémoire et vont directement instancier la classe passée en second paramètre.

    Comme vous dites l'idéal est de séparer la partie graphique du reste et lorsque justement je fais comme ça le code fonctionne parfaitement mais alors je ne vois pas trop comment je peux reconstruire dans la partie hôte (donc graphique) les menus et sous-menus désirés par le plugin et bien entendu de leur lier un événement (quoi que pour lier l'événement ce n'est à mon avis pas plus compliquer que de donner le libellé d'un MenuItem).

    Avez-vous une idée de comment je puisse par exemple reconstruire cette architecture de menu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PluginMenu
        +---- Item 1
        +---- Item 2
        +---- Item 3
        |         +---- Item 3 - 1
        |         +---- Item 3 - 2
        |         +---- Item 3 - 3
        |         +---- Item 3 - 4
        +---- Item 4

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/05/2011, 16h28
  2. JSP : Passage de variables entre différents blocs
    Par Bali8 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 31/08/2009, 21h34
  3. Réponses: 2
    Dernier message: 30/09/2006, 22h36
  4. [DOM] Problème entre différentes versions de java
    Par scorpiwolf dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 17/03/2005, 11h40
  5. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 19h51

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