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 :

Utilisation de plugin dans ma Winform


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Par défaut Utilisation de plugin dans ma Winform
    Bonjour tout le monde,

    Je suis occupé de regarder comment on crée des plugins dans des AppDomain à l'aide de l'excellent Tutoriel de Vincent Laine -> Utilisation des AppDomaine.net et je me heurte depuis 3 jours à une Exception: L'accès distant ne peut trouver le champ 'parent' sur le type System.Windows.form.Control.

    Le projet un composé d'une Interface Iplug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Interface IPlug
        Sub Init(ByVal Texte As String) ' Passage des paramètres
        Function Composant() As System.Windows.Forms.UserControl 'Transfert du plugin
    End Interface
    D'une classe Loader qui charge le plugin
    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
    Imports System.Reflection
     
    Public Class cLoader
        Inherits MarshalByRefObject
     
        Public Overrides Function InitializeLifetimeService() As Object
            Return Nothing
        End Function
     
         Public Function LoadPlug(ByVal file As String, ByVal classe As String) As Object
            Dim obj As Object
     
            'Charge et retourne l'assembly du plugin
            obj = Assembly.LoadFrom(file)
            Return CType(obj, [Assembly]).CreateInstance(classe, True)
     
        End Function
    D'un UserControl le Plugin
    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
    Public Class plug1
        Implements IPlug ' Implémente l'interface Iplug
     
        Private Messages As String = ""
     
        Public Sub Init(ByVal Texte As String) Implements IPlug.Init
            ' Transfert des paramètres du plugins
            Messages = Texte
        End Sub
        Public Function Composant() As System.Windows.Forms.UserControl Implements IPlug.Composant
            ' Retourne le comaposant
            Return Me
        End Function
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ' Affiche le message
            Label2.Text = Messages
        End Sub
    End Class
    D'une Winform créant un domaine et devant héberger le plugin.
    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
    Imports System.Reflection
    Public Class Host
        Private Plug As rnsPlugin.IPlug     ' L'assembly du plugin
        Private LeLoader As cLoader         ' Le loader du plugin
        Private DomainSetupInfo As AppDomainSetup = AppDomain.CurrentDomain.SetupInformation ' Information du domaine courant
        Private Domaine1 As AppDomain   'Domaine pour le plugin Interne
     
        Private Sub OpenDomainPlug()
     
            DomainSetupInfo.PrivateBinPath = Environment.CurrentDirectory
            DomainSetupInfo.ShadowCopyFiles = False.ToString
     
            Domaine1 = AppDomain.CreateDomain("MyDomainPlug", Nothing, DomainSetupInfo) ' Crée un nouveau domaine
            LeLoader = Domaine1.CreateInstanceAndUnwrap("Loader", "rnsPlugin.cLoader")  ' Intancifie la classe Loader dans ce nouveau Domaine
     
            Plug = LeLoader.LoadPlug("Plugin.dll", "rnsPlugin.plug1")
            gbPlug2.Controls.Add(Plug.Composant)
     
        End Sub
    End Class
    C'est la ligne -> gbPlug2.Controls.Add(Plug.Composant) Qui me génère la fameuse exception.
    Pensez-vous que cela soit réalisable, ou il est totalement impossible d'insérer un control créé dans un autre AppDomain dans ma Winform?
    Toutes les avis sont naturellement les biens venus.

    vous pouvez télécharger la solution complète -> ICI

    Dominique.
    P.S. J'utilise vb2005

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Je ne sais pas si cela seulement est lié à votre problème, mais je remarque que votre classe plug1, qui implémente IPlug, n'a pas de classe de base conforme à UserControl, donc encore moins à Control... qui implémente entre autres la propriété Parent, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class plug1
        '... et Inherits ???
        Implements IPlug ' Implémente l'interface Iplug
     
        Private Messages As String = ""
        ' ...
    'HTH

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Par défaut
    Bonsoir,

    La classe plug1 est un user control, il hérite donc nativement de la classe System.Windows.Form.UserControl

    Par acquis de conscience, j'ai rajouté le inherits System.Windows.Form.UserControl, mais cela ne change rien au problème.

    Merci de t'être intéressé à mon problème.
    Dominique.

    P.S. Si j'ouvre le plugin dans une nouvelle form créé sous le nouvel AppDomain, le plugin fonctionne correctement.

    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
    Private Sub OpenDomainExternePlug()
            DomainSetupInfo.PrivateBinPath = Environment.CurrentDirectory
            DomainSetupInfo.ShadowCopyFiles = False.ToString
     
            Domaine2 = AppDomain.CreateDomain("MyExternDomainPlug", Nothing, DomainSetupInfo) ' Crée un nouveau domaine
            LeLoader = Domaine2.CreateInstanceAndUnwrap("Loader", "rnsPlugin.cLoader") ' Intancifie la classe Loader dans ce nouveau Domaine
     
            ' Charge l'assembly
            Plug = LeLoader.LoadPlug("Plugin.dll", "rnsPlugin.plug1")
     
            Dim ExtHost As ExternHost
            ExtHost = LeLoader.ExtHost
     
            ' Transfert l'assembly à la feuille externe
            ExtHost.Init(Plug)
            ' Ouvre la feuille Extrene
            ExtHost.Show()
        End Sub
    et dans la Classe Loader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Imports System.Reflection
    Public Class cLoader
    Public ExtHost As New ExternHost 'Une Winform faisant partie de l'assembly Loader
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class ExternHost
        Private Plug As IPlug
     
        Public Sub Init(ByVal Obj As Object)
            Plug = CType(Obj, IPlug)
        End Sub
     
        Private Sub ExternHost_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Plug.Init("Hello externe World")
            gbPlug1.Controls.Add(Plug.Composant)
        End Sub
    End Class
    J'ai le problème simplement lorsque je veux intégrer le plugin dans ma forme principale.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par nouls Voir le message
    [...]
    J'ai le problème simplement lorsque je veux intégrer le plugin dans ma forme principale.
    Ok, très bien ; je n'ai pas testé ce tutoriel de Vincent Laine qui semble bien fait, en effet, mais je remarque par exemple qu'il précisait bien ceci à propos de UserControl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'Classe du plugin respectant le modèle : hérite de IPlugin et pour les appDomains on étend MarshalByRefObject
    'On ne touche à rien de la classe plugins car les composants WinForm heritent déja de MarshalByRefObject
    Public Class PluginClass Inherits System.Windows.Forms.UserControl Implements IPlugin
    	'Nous ne modifions rien au reste de la classe
    	'....
    End Class
    Ma question est donc : avez vous commencé par essayer de faire fonctionner son code tel quel avant de chercher à l'adapter à votre besoin ? Si oui, et si ce fut concluant, peut être avez vous manqué quelque chose d'autre, à la source de votre problème ?

    Suggestion : reprenez les éléments de son code point par point et comparez-les aux vôtres ; c'est un pré requis, amha.

    'HTH

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Par défaut
    Ma question est donc : avez vous commencé par essayer de faire fonctionner son code tel quel avant de chercher à l'adapter à votre besoin ? Si oui, et si ce fut concluant, peut être avez vous manqué quelque chose, à la source de votre problème ?
    Son code est dédié au Framework 1.0, et me donne quelques erreurs si je le reprends tel quel.
    J'ai toutefois tout à l'heure repris les fonctions principales de son code (loader - MainFrame) et j'ai la même erreur sur : tp.Controls.Add(CType(obj, IPlugin).VisualComponent)


    Suggestion : reprenez les éléments de son code point par point et comparez-les aux vôtres ; c'est un pré requis, amha.
    Cela fait 3 jours que je butte la dessus, et je peux t'assurer que je ai comparé et recomparé nos codes
    Sans oublié les divers essais en tous genres.

    Par contre, je n'arrive pas à trouver sur le net des sujets qui traitent de ma fameuse exception. Pourtant, j'ai pas mal retourné Google sur le sujet.

    Dominique.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Ok, j'ai récup votre solution. Je vais essayer d'y jeter un oeil et reviens vers vous asap.

Discussions similaires

  1. Utiliser une fonction dans un winForm
    Par benny-blanco dans le forum VB.NET
    Réponses: 4
    Dernier message: 10/03/2012, 18h44
  2. [Joomla!] Utiliser les plugins dans les composants personels
    Par staarkoo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 09/02/2011, 23h22
  3. Comment utiliser perl plugin dans netbeans
    Par ttttnht dans le forum NetBeans
    Réponses: 0
    Dernier message: 17/12/2009, 20h45
  4. Utilisation de plugin dans une application Web
    Par loopx dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 21/01/2008, 23h06
  5. Utiliser librairie externe dans son plugin
    Par ghillairet dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 09/01/2008, 10h56

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