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