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:
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:
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:
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:
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