Ceci est un exemple (simpliste) d'application gérant les plugins comme le font tant de logiciels.
Ceci permet en effet de créer des applications "modulaires" à souhait...
Il suffit de créer un nouveau plugin pour ajouter des fonctions (par exemple !)
Attention, ce code n'est qu'un exemple. Il ne fait rien de bien sorcier (à part afficher des boites de dialogue...)
Par contre, l'architecture est là, et elle peut reservir avec des projets plus conséquents !
Détails :
Le projet "Interface" permet de définir les fonctions et procédures qui devront se trouver dans chaque plugin.
Il y a deux projets de plugins : une dll et un exe. Ces deux projets font références à la dll du projet Interface
Il y a enfin le projet principal, qui lui aussi fait référence à la dll Interface. Par contre il ne fait aucune référence aux projets de plugins, puisque cela est géré dans le code
Conclusion :
Cette source est adaptée d'un article (en français !) qui se trouve ici :
http://pascalfresnay.free.fr/monoweb/wiki/index.php?title=TUTORIAL:_Syst%C3%A8me_Plugin
Cependant, je n'ai pas trouvé de truc semblable sur VBfrance, alors je poste, histoire d'éviter 10min. de recherche sur google au prochain intéressé...
14 nov. 2007 à 17:47
Avez vous exactement pareil pour Vb6 ? ou peut t'on la traduire en Visual Basic 6 ?
merci
18 juil. 2007 à 01:25
pour mon erreur, c'était ma faute, je n'avais pas remarquer que la DLL c'était transféré de debug à release sans que je lui dise de changer. Donc j'exécutais toujours avec le même plugin
le code fonctionne numéro 1
merci beaucoup
17 juil. 2007 à 22:07
14 juil. 2007 à 20:03
voilà mon problème
Un projet Plugin qui possède une interface "iPlugin"
j'ai une application, qui référence la DLL de "iPlugin", appelons là "application" lol
Un projet myPlugin, qui référence la DLL de "iPlugin", qui possède une class "plug" qui implémente "iPlugin"
Donc en gros j'ai 2 applications qui référence mon interface "iPlugin"
Ensuite, dans "application" je fais ceci
-------------------------------------------
Public Sub New()
' Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
Dim tx As String
Dim dll As Reflection.Assembly
Dim tp As Type
'chargement du plugin1
tx = "C:\Documents and Settings\Administrateur\Mes documents\Visual Studio 2005\Projects\PlugTest\PlugTest\bin\Debug\PlugTest.dll" 'emplacement de la dll
'chargement de la dll
dll = Reflection.Assembly.LoadFrom(tx)
'Vérification de la présence de l'interface recherchée
Try
For Each tp In dll.GetTypes
If tp.IsClass Then
If tp.GetInterface("iPlugin", True) IsNot Nothing Then
'création de la référence au plugin
i1 = dll.CreateInstance(tp.ToString)
Exit Try
End If
End If
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
testt(New Outil2)
End Sub
Private Sub testt(ByVal outil As [Plugin].iOutil)
Try
CType(i1, Plugin.iPlugin).ReceiveOutil(outil)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Dim i1 As [Plugin].iPlugin
---------------------------------------------
En théorie, je devrais loader "myPlugin" et ensuite appeller la méthode "ReceiveOutil" pour lui envoyer quelques informations
Mais je Bug avant ça
je trouve mon Plugin dans le For
mais dès que je load, ça plante "i1 = dll.CreateInstance(tp.ToString)"
En gros, il dit que "myPlugin" ne peux pas être convertie de type "iPlugin", malgré que ma class implément réellement l'interface. J'ai même essayé avec héritable et ceci donne le même résultat.
On dirait à l'intérieur d'un même projet, il gère bien le passage de class vers le type interface qui implémente, mais ceci n'a pas l'air de marche si la class arrive d'une DLL.
ce que je comprend le moins, c'est que l'exemple fonctionne très bien et si je fait un ctype(dll.CreateInstance(tp.ToString),"iPlugin") sur mon projet, il n,est pas capapble, mais dans l'exemple oui ??? Pourtant je me suis bien assurer que l'interface utilisé était bien la même, c'est même exactement le même fichier sur mon disque dur et j'ai bien regéré tout les projet
Quelqu'un peut m'aider ???
30 juin 2007 à 14:00
Là ca marche, vais essayer d'en tirer des connaissances ^^ Merci 10/10
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.