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
D'une classe Loader qui charge le plugin
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'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 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'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 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
C'est la ligne -> gbPlug2.Controls.Add(Plug.Composant) Qui me génère la fameuse exception.
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
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
Partager