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
Partager