[VB.Net] - Gestion de plugin (Assembly, Appdomain)
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:
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 |