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 :

Utiliser un UserControl dans un autre AppDomain possible?


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut Utiliser un UserControl dans un autre AppDomain possible?
    Bonjour.

    Toujours dans mon projet avec des plugins, je rencontre un problème auquel je n'avais pas pensé...

    Mes plugins sont chargés dans un AppDomain (donc il y a du remoting), ma fenetre principale est dans l'AppDomain "principal" de l'appli.

    Mon plugin construit un UserControl qu'il retourne à l'appli pour qu'elle l'affiche.

    Mais quand l'appli tente d'utiliser le User Control, j'ai un RemotingException:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Controls.Add(_plg.BuildUI());
    L'accès distant ne peut pas trouver le champ 'parent' sur le type 'System.Windows.Forms.Control'.
    C'est bête hein?

    Je ne vois pas trop quel pattern appliquer pour corriger le problème....

    Une idée quelqu'un?

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Le problème semble être connu :
    On ne peut pas faire communiquer une form/Control depuis un AppDomain, avec une autre Form/Control qui est dans un autre AppDomain, car elles ne peuvent pas accéder aux membres privés à travers des AppDomain différent. Parent etant privé ca coince.

    Enfin, c'est ce que j'ai compris, meme si pour moi, quand c'est privé, AppDomain ou pas, les autres objets ne peuvent pas y accéder

    Je vais donc voir si je ne peux pas depuis mon AppDomain principale instancier "en local" le UIControl du plugin....

    En utilisant le nom du (String)type et assemblyName du UIControl peut etre...

  3. #3
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Le coup des membre privés ne devrait pas poser de problème, d'autant que les propriétés Parent et Controls sont publique sur Control et Form.
    Par contre, ce que tu obtiens par remoting n'est pas un Control, mais un proxy.
    Il est sensé avoir la même interface publique et transmettre les appels cross domains.
    Cependant, vu que c'est un proxy la reflexion sur l'objet peut échouer (ou retourner n'importe quoi).
    De plus, il ne faut pas oublie que les WinForm sont une encapsulation de l'API Win32 qui elle n'est pas du tout managée. En créant un contrôle dans un domain, un handle y est créé avec et celui-ci ne traverse pas le domaine par défaut.

    Voici un article qui devrait te donner des pistes pour te sortir de tout ca :
    http://do-the-right-things.blogspot....mentation.html

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Un grand merci à toi pour ta réponse et cet article fort interressant !

    Pris par le temps, je me suis lancé dans une "bidouille de haute voltige"

    Possible car le lien entre ce UserControl et la form est extremement faible.

    Coté plugin, je crée une form sans bordure, y place mon user controle.
    Et j'ai fais une interface qui permet du coté AppDomain principal de faire des Show Hide Location Size sur cette "fausse" Form.

    Ce sont les seules interactions inter domaine que je me permet. Et du coup je fais passer ma FormPlugin pour un panel de ma Form principale.

    C'est pas super propre, j'ai un peu de flikering, mais ca dépanne

    Cet UserControl ne sert qu'à configurer le plugin, donc ca n'est pas très grave si ca rame un peu

Discussions similaires

  1. [Blend 4] Utiliser un UserControl dans un autre UserControl
    Par Jazz_ dans le forum Expression Studio
    Réponses: 2
    Dernier message: 23/07/2013, 15h56
  2. Wascana, utilisation de classe dans un autre projet
    Par BugBunny dans le forum Eclipse C & C++
    Réponses: 0
    Dernier message: 04/10/2008, 12h07
  3. [Silverlight 2]affichage d'un UserControl dans un autre
    Par cinemania dans le forum Silverlight
    Réponses: 3
    Dernier message: 31/03/2008, 17h04
  4. Utiliser un tableau dans une autre frame
    Par reureu dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/08/2007, 14h23
  5. Réponses: 1
    Dernier message: 24/03/2007, 18h50

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