Bonjour,

je réalise une applicaiton dans laquelle je souhaite implémenter un systeme de plugins.
J'ai donc un .exe central et dans un répertoire "plugins", des dll qui sont les plugins
Au démarrage de l'appli, je parcours le répertoire plugins, a chaque fois que je rencontre une dll, je la charge en tant qu'assembly, je verifie via la réflexion si l'assembly contient un type implémentant une interface et si c'est le cas, j'instancie ce type pour l'ajouter dans mon appli.

Tout ca marche très bien

2 ème étape, je souhaite ajouter un gestionnaire de plugin dans mon appli: le gestionnaire pourrait ajouter ou supprimer des plugins.
Concernant la suppression de plugins, je veux supprimer les dll correspondante. Cependant, pour les supprimer, je dois déréférencer l'assembly de mon appli. Par contre, on ne peut pas déréférencer comme ca, on est obligé de décharger l'appdomain correspondant

Il faudrait donc que je puisse créer pour chaque plugin (dll, assembly) un appdomain correspondant.

Et c'est la ou je bloque, je n'arrive pas à créer un appdomain par plugin....

Si vous avez des idées, je commence vraiment à bloquer la

Rollerman


Code VB.Net : 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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
'*****************************************************************************************************
        'fonction scannant un répertoire et retournant un arraylist avec la liste des plugins trouvés
        Public Sub load_plugins(ByVal e_plugins_directory As String)
 
            'init les arraylist
            singleton.t_plugins = New ArrayList
 
            'parcours le dossier plugins pour charger les plugins
            Dim chemin As String = e_plugins_directory
            Dim d As String
 
            'pour chaque répertoire dans le répertoire plugin
            For Each d In IO.Directory.GetDirectories(chemin)
 
                'cree un domain pour le repertoire
                Dim setup_test As New AppDomainSetup
                Dim domain_name As String = "domain_" & d.Substring(d.LastIndexOf("\") + 1)
                setup_test.ApplicationBase = d
                setup_test.PrivateBinPath = d
                current_domain = AppDomain.CreateDomain(domain_name, Nothing, setup_test)
 
                'parse les dll du dossier
                current_directory_plugin = d
                current_domain.DoCallBack(AddressOf scan_plugin_folder)
 
            Next
 
        End Sub
 
        Public Sub scan_plugin_folder()
            'parse les fichiers
            Dim f As String
            For Each f In IO.Directory.GetFiles(current_directory_plugin)
                'si c une dll
                If f.EndsWith(".dll") Then
                    'on charge la dll par réflexion
                    Dim monAssembly As [Assembly]
                    Try
                        monAssembly = System.Reflection.Assembly.LoadFrom(f)
                        'parcourt les type de l'assembly
                        Dim MonType As Type
                        For Each MonType In monAssembly.GetTypes()
                            'pour chaque type, on regarde si il hérite de uc_multimedia
                            If MonType.BaseType.Name = "uc_multimedia" Then
                                'instancie & ajoute au tableau
                                singleton.t_plugins.Add(current_domain.CreateInstanceFrom(monAssembly.FullName, MonType.Name))
                            End If
                        Next
                    Catch ex As Exception
                        'rien, c'est que ce n'est pas une assembly valide
                    End Try
                End If
            Next
        End Sub