Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Urgent] Pb avec plugin "maison" (impossible d'instancier mes objets !!!)

7 réponses
Avatar
Cédric Girard
Bonjour

Je suis en train d'implémenter un système de plug-ins dans une appli,
simplement basé sur une interface simplissime dont voici le code :

############################################################################
################
Namespace GIAUBE
'----- Définition de l'interface de base pour les applications en plug-ins
Public Interface iPlugin
Function IDPlugin() As Int32 'Retourne l'ID du plug-in
Function Icone() As Image 'Retourne l'icône associée au plug-in
Function Libellé() As String 'Retourne le libellé associé au plug-in
Function Description() As String 'Retourne un descriptif pour le tooltip
du plug-in
Sub Run(ByVal IDAgent As Int32) 'Permet d'exécuter le plug-in
End Interface
End Namespace
############################################################################
################

Mon but étant de gérer une IHM "chargeant" tous les composants applicatifs
sous forme d'icônes (listview dans mon cas), un double-clic sur une icône
exécutant le plug-in en question (appel de la méthode "Run" avec identifiant
de l'utilisateur, etc... Je simplifie !) => permet d'afficher des modules
spécifiques à nos applications internes, ou plus simplement de lancer des
applications quelconques.


Le hic, lorsque dans mon projet principal je parcours mon répertoire pour
localiser mes DLL et récupérer les infos de chaque plugin, ça coince !

Mon code :
############################################################################
################
'----- Procédure de chargement des plug-ins
Sub _ChargementPlugins()

'Déclaration des variables locales
Dim _oTypes() As Type
'Liste de types
Dim _sPluginDirectory As String = IO.Path.GetDirectoryName( _
System.Reflection.Assembly.GetCallingAssembly.Location)
'Répertoire courant
Dim _sPlugs() As String = IO.Directory.GetFiles(_sPluginDirectory,
"GI*.dll") 'Filtre sur les DLL

For Each _sPlug As String In _sPlugs
'Pour chaque DLL du répertoire
Try
'Tentative de chargement de l'assembly
Dim _oAss As System.Reflection.Assembly = _
System.Reflection.Assembly.LoadFrom(_sPlug)
_oTypes = _oAss.GetTypes()
For Each _oType As Type In _oTypes
'Pour chaque type contenu dans l'assembly
If Not _oType.GetInterface("GIAUBE.iPlugin") Is Nothing
Then
'Plug-in trouvé !
Try
Dim _Obj As Object =
AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(_sPlug,
"GIAUBE.iPlugin") 'XXXXXXXX ERREUR !!! :-((
MsgBox(CType(_Obj, GIAUBE.iPlugin).Libellé())
'<<<<<====== ICI TEST POUR VERIF BON FONCTIONNEMENT
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
Next
Catch ex As Exception
'Rien
End Try
Next

End Sub
############################################################################
################

À chaque fois il me claque un message "Le constructeur sur le type
GIAUBE.iPlugin est introuvable", alors que j'ai bien un constructeur (bidon,
certes) dans ma classe implémentant mon interface !!! (dont voici le code)

############################################################################
################
Namespace GIAUBE

Public Class clsGITravaux
Implements iPlugin

'--Constructeur
Public Sub New()

End Sub

'-- Retourne la description du module en cours
Public Function Description() As String Implements
iPlugin.Description
Return "Saisie et édition de vos temps de travaux"
End Function

'Retourne l'icône représentative du module
Public Function Icone() As System.Drawing.Image Implements
iPlugin.Icone

'Déclaration des variables locales
Dim _asm As System.Reflection.Assembly =
System.Reflection.Assembly.GetExecutingAssembly
Dim _img As Image =
Bitmap.FromStream(_asm.GetManifestResourceStream("GITravaux._travaux.ico"))

Return _img 'Retourne l'image intégrée

_img.Dispose() 'Libération des ressources

End Function

'Retourne l'identifiant du module
Public Function IDPlugin() As Integer Implements iPlugin.IDPlugin
Return 105
End Function

'Retourne le libellé du module
Public Function Libellé() As String Implements iPlugin.Libellé
Return "Travaux"
End Function

'Exécute la fonctionnalité associée au module
Public Sub Run(ByVal IDAgent As Integer) Implements iPlugin.Run

'Déclaration des variables locales
Dim _oTravaux As New frmTrav(IDAgent) 'Objet formulaire
travaux

_oTravaux.ShowDialog() 'Affichage de la fenêtre
de saisie

_oTravaux.Dispose() 'Sortie "propre"

End Sub

End Class

End Namespace
############################################################################
################


Qqu'un pourrait m'aider sur ce coup-là ?...

Plus simplement, peut-on facilement instancier une assembly (dans mon code,
directement à partir de l'objet _oAss, au niveau de mon erreur) ?

MERCI

--
Cédric Girard
OCERA CFGA (Aube)
Mon site perso : http://www.mainecoon.fr

7 réponses

Avatar
Cédric Girard
Quel c... !

Forcément : j'essayais d'instancier l'interface :-/ au lieu de ma classe
!!!

J'ai remplacé ma ligne d'erreur par :
Dim _Obj As Object = _oAss.CreateInstance(_oType.Namespace & "." &
_oType.Name)

Plus d'erreur... sauf que j'arrive pas à utiliser mon objet :-[

Me dit que le cast est invalide... Je cherche et je vais trouver...




--
Cédric Girard
OCERA CFGA (Aube)
Mon site perso : http://www.mainecoon.fr
Avatar
c2i-Richard Clark [MVP]
et si tu rajoute Sub New() dans ton interface ?

--
Richard Clark
http://www.c2i.fr - Le portail .NET
[Microsoft MVP .NET]
______________________________________________
'Au coeur de VB .NET' (MS Press, 430 pages, 34 euros)
http://www.amazon.fr/exec/obidos/ASIN/2100065645/c2ifrleportad-21
______________________________________________

"Cédric Girard" wrote in message
news:
Bonjour

Je suis en train d'implémenter un système de plug-ins dans une appli,
simplement basé sur une interface simplissime dont voici le code :




############################################################################
################
Namespace GIAUBE
'----- Définition de l'interface de base pour les applications en plug-ins
Public Interface iPlugin
Function IDPlugin() As Int32 'Retourne l'ID du plug-in
Function Icone() As Image 'Retourne l'icône associée au plug-in
Function Libellé() As String 'Retourne le libellé associé au plug-in
Function Description() As String 'Retourne un descriptif pour le


tooltip
du plug-in
Sub Run(ByVal IDAgent As Int32) 'Permet d'exécuter le plug-in
End Interface
End Namespace



############################################################################
################

Mon but étant de gérer une IHM "chargeant" tous les composants applicatifs
sous forme d'icônes (listview dans mon cas), un double-clic sur une icône
exécutant le plug-in en question (appel de la méthode "Run" avec


identifiant
de l'utilisateur, etc... Je simplifie !) => permet d'afficher des modules
spécifiques à nos applications internes, ou plus simplement de lancer des
applications quelconques.


Le hic, lorsque dans mon projet principal je parcours mon répertoire pour
localiser mes DLL et récupérer les infos de chaque plugin, ça coince !

Mon code :



############################################################################
################
'----- Procédure de chargement des plug-ins
Sub _ChargementPlugins()

'Déclaration des variables locales
Dim _oTypes() As Type
'Liste de types
Dim _sPluginDirectory As String = IO.Path.GetDirectoryName( _
System.Reflection.Assembly.GetCallingAssembly.Location)
'Répertoire courant
Dim _sPlugs() As String = IO.Directory.GetFiles(_sPluginDirectory,
"GI*.dll") 'Filtre sur les DLL

For Each _sPlug As String In _sPlugs
'Pour chaque DLL du répertoire
Try
'Tentative de chargement de l'assembly
Dim _oAss As System.Reflection.Assembly = _
System.Reflection.Assembly.LoadFrom(_sPlug)
_oTypes = _oAss.GetTypes()
For Each _oType As Type In _oTypes
'Pour chaque type contenu dans l'assembly
If Not _oType.GetInterface("GIAUBE.iPlugin") Is


Nothing
Then
'Plug-in trouvé !
Try
Dim _Obj As Object > AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(_sPlug,
"GIAUBE.iPlugin") 'XXXXXXXX ERREUR !!! :-((
MsgBox(CType(_Obj, GIAUBE.iPlugin).Libellé())
'<<<<<====== ICI TEST POUR VERIF BON FONCTIONNEMENT
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
Next
Catch ex As Exception
'Rien
End Try
Next

End Sub



############################################################################
################

À chaque fois il me claque un message "Le constructeur sur le type
GIAUBE.iPlugin est introuvable", alors que j'ai bien un constructeur


(bidon,
certes) dans ma classe implémentant mon interface !!! (dont voici le code)




############################################################################
################
Namespace GIAUBE

Public Class clsGITravaux
Implements iPlugin

'--Constructeur
Public Sub New()

End Sub

'-- Retourne la description du module en cours
Public Function Description() As String Implements
iPlugin.Description
Return "Saisie et édition de vos temps de travaux"
End Function

'Retourne l'icône représentative du module
Public Function Icone() As System.Drawing.Image Implements
iPlugin.Icone

'Déclaration des variables locales
Dim _asm As System.Reflection.Assembly > System.Reflection.Assembly.GetExecutingAssembly
Dim _img As Image >


Bitmap.FromStream(_asm.GetManifestResourceStream("GITravaux._travaux.ico"))

Return _img 'Retourne l'image intégrée

_img.Dispose() 'Libération des ressources

End Function

'Retourne l'identifiant du module
Public Function IDPlugin() As Integer Implements iPlugin.IDPlugin
Return 105
End Function

'Retourne le libellé du module
Public Function Libellé() As String Implements iPlugin.Libellé
Return "Travaux"
End Function

'Exécute la fonctionnalité associée au module
Public Sub Run(ByVal IDAgent As Integer) Implements iPlugin.Run

'Déclaration des variables locales
Dim _oTravaux As New frmTrav(IDAgent) 'Objet formulaire
travaux

_oTravaux.ShowDialog() 'Affichage de la


fenêtre
de saisie

_oTravaux.Dispose() 'Sortie "propre"

End Sub

End Class

End Namespace



############################################################################
################


Qqu'un pourrait m'aider sur ce coup-là ?...

Plus simplement, peut-on facilement instancier une assembly (dans mon


code,
directement à partir de l'objet _oAss, au niveau de mon erreur) ?

MERCI

--
Cédric Girard
OCERA CFGA (Aube)
Mon site perso : http://www.mainecoon.fr




Avatar
c2i-Richard Clark [MVP]
pardon, j'ai dis une connerie. C'est dans l'instanciation qu'il y a un
pb.CreateInstanceFromAndUnwrap est utilisé pour le remoting et permet de
créer un proxy de ta classe coté client. Donc c'est pas ce que tu cherches à
faire ici.. C'est CreateInstance (ou Activator.CreateInstance) qu'il faut
utiliser. Fait bien attention aux flags.

--
Richard Clark
http://www.c2i.fr - Le portail .NET
[Microsoft MVP .NET]
______________________________________________
'Au coeur de VB .NET' (MS Press, 430 pages, 34 euros)
http://www.amazon.fr/exec/obidos/ASIN/2100065645/c2ifrleportad-21
______________________________________________

"Cédric Girard" wrote in message
news:
Bonjour

Je suis en train d'implémenter un système de plug-ins dans une appli,
simplement basé sur une interface simplissime dont voici le code :




############################################################################
################
Namespace GIAUBE
'----- Définition de l'interface de base pour les applications en plug-ins
Public Interface iPlugin
Function IDPlugin() As Int32 'Retourne l'ID du plug-in
Function Icone() As Image 'Retourne l'icône associée au plug-in
Function Libellé() As String 'Retourne le libellé associé au plug-in
Function Description() As String 'Retourne un descriptif pour le


tooltip
du plug-in
Sub Run(ByVal IDAgent As Int32) 'Permet d'exécuter le plug-in
End Interface
End Namespace



############################################################################
################

Mon but étant de gérer une IHM "chargeant" tous les composants applicatifs
sous forme d'icônes (listview dans mon cas), un double-clic sur une icône
exécutant le plug-in en question (appel de la méthode "Run" avec


identifiant
de l'utilisateur, etc... Je simplifie !) => permet d'afficher des modules
spécifiques à nos applications internes, ou plus simplement de lancer des
applications quelconques.


Le hic, lorsque dans mon projet principal je parcours mon répertoire pour
localiser mes DLL et récupérer les infos de chaque plugin, ça coince !

Mon code :



############################################################################
################
'----- Procédure de chargement des plug-ins
Sub _ChargementPlugins()

'Déclaration des variables locales
Dim _oTypes() As Type
'Liste de types
Dim _sPluginDirectory As String = IO.Path.GetDirectoryName( _
System.Reflection.Assembly.GetCallingAssembly.Location)
'Répertoire courant
Dim _sPlugs() As String = IO.Directory.GetFiles(_sPluginDirectory,
"GI*.dll") 'Filtre sur les DLL

For Each _sPlug As String In _sPlugs
'Pour chaque DLL du répertoire
Try
'Tentative de chargement de l'assembly
Dim _oAss As System.Reflection.Assembly = _
System.Reflection.Assembly.LoadFrom(_sPlug)
_oTypes = _oAss.GetTypes()
For Each _oType As Type In _oTypes
'Pour chaque type contenu dans l'assembly
If Not _oType.GetInterface("GIAUBE.iPlugin") Is


Nothing
Then
'Plug-in trouvé !
Try
Dim _Obj As Object > AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(_sPlug,
"GIAUBE.iPlugin") 'XXXXXXXX ERREUR !!! :-((
MsgBox(CType(_Obj, GIAUBE.iPlugin).Libellé())
'<<<<<====== ICI TEST POUR VERIF BON FONCTIONNEMENT
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
Next
Catch ex As Exception
'Rien
End Try
Next

End Sub



############################################################################
################

À chaque fois il me claque un message "Le constructeur sur le type
GIAUBE.iPlugin est introuvable", alors que j'ai bien un constructeur


(bidon,
certes) dans ma classe implémentant mon interface !!! (dont voici le code)




############################################################################
################
Namespace GIAUBE

Public Class clsGITravaux
Implements iPlugin

'--Constructeur
Public Sub New()

End Sub

'-- Retourne la description du module en cours
Public Function Description() As String Implements
iPlugin.Description
Return "Saisie et édition de vos temps de travaux"
End Function

'Retourne l'icône représentative du module
Public Function Icone() As System.Drawing.Image Implements
iPlugin.Icone

'Déclaration des variables locales
Dim _asm As System.Reflection.Assembly > System.Reflection.Assembly.GetExecutingAssembly
Dim _img As Image >


Bitmap.FromStream(_asm.GetManifestResourceStream("GITravaux._travaux.ico"))

Return _img 'Retourne l'image intégrée

_img.Dispose() 'Libération des ressources

End Function

'Retourne l'identifiant du module
Public Function IDPlugin() As Integer Implements iPlugin.IDPlugin
Return 105
End Function

'Retourne le libellé du module
Public Function Libellé() As String Implements iPlugin.Libellé
Return "Travaux"
End Function

'Exécute la fonctionnalité associée au module
Public Sub Run(ByVal IDAgent As Integer) Implements iPlugin.Run

'Déclaration des variables locales
Dim _oTravaux As New frmTrav(IDAgent) 'Objet formulaire
travaux

_oTravaux.ShowDialog() 'Affichage de la


fenêtre
de saisie

_oTravaux.Dispose() 'Sortie "propre"

End Sub

End Class

End Namespace



############################################################################
################


Qqu'un pourrait m'aider sur ce coup-là ?...

Plus simplement, peut-on facilement instancier une assembly (dans mon


code,
directement à partir de l'objet _oAss, au niveau de mon erreur) ?

MERCI

--
Cédric Girard
OCERA CFGA (Aube)
Mon site perso : http://www.mainecoon.fr




Avatar
c2i-Richard Clark [MVP]
Abruti va !!! (je me parle à moi même ;-))))

--
Richard Clark
http://www.c2i.fr - Le portail .NET
[Microsoft MVP .NET]
______________________________________________
'Au coeur de VB .NET' (MS Press, 430 pages, 34 euros)
http://www.amazon.fr/exec/obidos/ASIN/2100065645/c2ifrleportad-21
______________________________________________

"c2i-Richard Clark [MVP]" wrote in message
news:OD%
et si tu rajoute Sub New() dans ton interface ?

--
Richard Clark
http://www.c2i.fr - Le portail .NET
[Microsoft MVP .NET]
______________________________________________
'Au coeur de VB .NET' (MS Press, 430 pages, 34 euros)
http://www.amazon.fr/exec/obidos/ASIN/2100065645/c2ifrleportad-21
______________________________________________

"Cédric Girard" wrote in message
news:
> Bonjour
>
> Je suis en train d'implémenter un système de plug-ins dans une appli,
> simplement basé sur une interface simplissime dont voici le code :
>
>



############################################################################
> ################
> Namespace GIAUBE
> '----- Définition de l'interface de base pour les applications en


plug-ins
> Public Interface iPlugin
> Function IDPlugin() As Int32 'Retourne l'ID du plug-in
> Function Icone() As Image 'Retourne l'icône associée au plug-in
> Function Libellé() As String 'Retourne le libellé associé au plug-in
> Function Description() As String 'Retourne un descriptif pour le
tooltip
> du plug-in
> Sub Run(ByVal IDAgent As Int32) 'Permet d'exécuter le plug-in
> End Interface
> End Namespace
>



############################################################################
> ################
>
> Mon but étant de gérer une IHM "chargeant" tous les composants


applicatifs
> sous forme d'icônes (listview dans mon cas), un double-clic sur une


icône
> exécutant le plug-in en question (appel de la méthode "Run" avec
identifiant
> de l'utilisateur, etc... Je simplifie !) => permet d'afficher des


modules
> spécifiques à nos applications internes, ou plus simplement de lancer


des
> applications quelconques.
>
>
> Le hic, lorsque dans mon projet principal je parcours mon répertoire


pour
> localiser mes DLL et récupérer les infos de chaque plugin, ça coince !
>
> Mon code :
>



############################################################################
> ################
> '----- Procédure de chargement des plug-ins
> Sub _ChargementPlugins()
>
> 'Déclaration des variables locales
> Dim _oTypes() As Type
> 'Liste de types
> Dim _sPluginDirectory As String = IO.Path.GetDirectoryName( _
> System.Reflection.Assembly.GetCallingAssembly.Location)
> 'Répertoire courant
> Dim _sPlugs() As String IO.Directory.GetFiles(_sPluginDirectory,
> "GI*.dll") 'Filtre sur les DLL
>
> For Each _sPlug As String In _sPlugs
> 'Pour chaque DLL du répertoire
> Try
> 'Tentative de chargement de l'assembly
> Dim _oAss As System.Reflection.Assembly = _
> System.Reflection.Assembly.LoadFrom(_sPlug)
> _oTypes = _oAss.GetTypes()
> For Each _oType As Type In _oTypes
> 'Pour chaque type contenu dans l'assembly
> If Not _oType.GetInterface("GIAUBE.iPlugin") Is
Nothing
> Then
> 'Plug-in trouvé !
> Try
> Dim _Obj As Object > > AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(_sPlug,
> "GIAUBE.iPlugin") 'XXXXXXXX ERREUR !!! :-((
> MsgBox(CType(_Obj,


GIAUBE.iPlugin).Libellé())
> '<<<<<====== ICI TEST POUR VERIF BON FONCTIONNEMENT
> Catch ex As Exception
> MsgBox(ex.Message)
> End Try
> End If
> Next
> Catch ex As Exception
> 'Rien
> End Try
> Next
>
> End Sub
>



############################################################################
> ################
>
> À chaque fois il me claque un message "Le constructeur sur le type
> GIAUBE.iPlugin est introuvable", alors que j'ai bien un constructeur
(bidon,
> certes) dans ma classe implémentant mon interface !!! (dont voici le


code)
>
>



############################################################################
> ################
> Namespace GIAUBE
>
> Public Class clsGITravaux
> Implements iPlugin
>
> '--Constructeur
> Public Sub New()
>
> End Sub
>
> '-- Retourne la description du module en cours
> Public Function Description() As String Implements
> iPlugin.Description
> Return "Saisie et édition de vos temps de travaux"
> End Function
>
> 'Retourne l'icône représentative du module
> Public Function Icone() As System.Drawing.Image Implements
> iPlugin.Icone
>
> 'Déclaration des variables locales
> Dim _asm As System.Reflection.Assembly > > System.Reflection.Assembly.GetExecutingAssembly
> Dim _img As Image > >



Bitmap.FromStream(_asm.GetManifestResourceStream("GITravaux._travaux.ico"))
>
> Return _img 'Retourne l'image intégrée
>
> _img.Dispose() 'Libération des ressources
>
> End Function
>
> 'Retourne l'identifiant du module
> Public Function IDPlugin() As Integer Implements


iPlugin.IDPlugin
> Return 105
> End Function
>
> 'Retourne le libellé du module
> Public Function Libellé() As String Implements iPlugin.Libellé
> Return "Travaux"
> End Function
>
> 'Exécute la fonctionnalité associée au module
> Public Sub Run(ByVal IDAgent As Integer) Implements iPlugin.Run
>
> 'Déclaration des variables locales
> Dim _oTravaux As New frmTrav(IDAgent) 'Objet formulaire
> travaux
>
> _oTravaux.ShowDialog() 'Affichage de la
fenêtre
> de saisie
>
> _oTravaux.Dispose() 'Sortie "propre"
>
> End Sub
>
> End Class
>
> End Namespace
>



############################################################################
> ################
>
>
> Qqu'un pourrait m'aider sur ce coup-là ?...
>
> Plus simplement, peut-on facilement instancier une assembly (dans mon
code,
> directement à partir de l'objet _oAss, au niveau de mon erreur) ?
>
> MERCI
>
> --
> Cédric Girard
> OCERA CFGA (Aube)
> Mon site perso : http://www.mainecoon.fr
>
>




Avatar
Cédric Girard
OK donc là ça fonctionne (pour la création de l'instance) mais j'ai un
problème sur la "ligne" suivante : impossible de caster mon objet ! :-(((

Me dit qu'il y a une erreur de casting...

Try
Dim _Obj As Object _oAss.CreateInstance(_oType.Namespace & "." & _oType.Name) '
MsgBox(CType(_Obj, GIAUBE.iPlugin).Libellé())
'<<<<<<<< ICI
Catch ex As Exception
MsgBox(ex.Message)
End Try

Il faut bien caster vers l'interface utilisée par mes plugins, non ? Je suis
certain de l'avoir déjà fait, c'est ça le pire, mais je me rappelle plus
dans quel programme (à mon avis c'était un jour où j'ai voulu tester le
truc...) et là, je veux l'utiliser en prod et paf, ça marche pô...


PS : pour les flags, je suis un peu "limite" donc j'ai laissé sans y toucher
(c'est peut-être ça d'ailleurs qui merdouille !!!)

PS 2 : le code ci-dessus c'est pour test, le final aura une gestion des
exceptions un peu plus poussée ;-)

--
Cédric Girard
OCERA CFGA (Aube)
Mon site perso : http://www.mainecoon.fr



"c2i-Richard Clark [MVP]" a écrit dans le message de
news:%
pardon, j'ai dis une connerie. C'est dans l'instanciation qu'il y a un
pb.CreateInstanceFromAndUnwrap est utilisé pour le remoting et permet de
créer un proxy de ta classe coté client. Donc c'est pas ce que tu cherches


à
faire ici.. C'est CreateInstance (ou Activator.CreateInstance) qu'il faut
utiliser. Fait bien attention aux flags.

--
Richard Clark
http://www.c2i.fr - Le portail .NET
[Microsoft MVP .NET]
______________________________________________
'Au coeur de VB .NET' (MS Press, 430 pages, 34 euros)
http://www.amazon.fr/exec/obidos/ASIN/2100065645/c2ifrleportad-21
______________________________________________

"Cédric Girard" wrote in message
news:
> Bonjour
>
> Je suis en train d'implémenter un système de plug-ins dans une appli,
> simplement basé sur une interface simplissime dont voici le code :
>
>



############################################################################
> ################
> Namespace GIAUBE
> '----- Définition de l'interface de base pour les applications en


plug-ins
> Public Interface iPlugin
> Function IDPlugin() As Int32 'Retourne l'ID du plug-in
> Function Icone() As Image 'Retourne l'icône associée au plug-in
> Function Libellé() As String 'Retourne le libellé associé au plug-in
> Function Description() As String 'Retourne un descriptif pour le
tooltip
> du plug-in
> Sub Run(ByVal IDAgent As Int32) 'Permet d'exécuter le plug-in
> End Interface
> End Namespace
>



############################################################################
> ################
>
> Mon but étant de gérer une IHM "chargeant" tous les composants


applicatifs
> sous forme d'icônes (listview dans mon cas), un double-clic sur une


icône
> exécutant le plug-in en question (appel de la méthode "Run" avec
identifiant
> de l'utilisateur, etc... Je simplifie !) => permet d'afficher des


modules
> spécifiques à nos applications internes, ou plus simplement de lancer


des
> applications quelconques.
>
>
> Le hic, lorsque dans mon projet principal je parcours mon répertoire


pour
> localiser mes DLL et récupérer les infos de chaque plugin, ça coince !
>
> Mon code :
>



############################################################################
> ################
> '----- Procédure de chargement des plug-ins
> Sub _ChargementPlugins()
>
> 'Déclaration des variables locales
> Dim _oTypes() As Type
> 'Liste de types
> Dim _sPluginDirectory As String = IO.Path.GetDirectoryName( _
> System.Reflection.Assembly.GetCallingAssembly.Location)
> 'Répertoire courant
> Dim _sPlugs() As String IO.Directory.GetFiles(_sPluginDirectory,
> "GI*.dll") 'Filtre sur les DLL
>
> For Each _sPlug As String In _sPlugs
> 'Pour chaque DLL du répertoire
> Try
> 'Tentative de chargement de l'assembly
> Dim _oAss As System.Reflection.Assembly = _
> System.Reflection.Assembly.LoadFrom(_sPlug)
> _oTypes = _oAss.GetTypes()
> For Each _oType As Type In _oTypes
> 'Pour chaque type contenu dans l'assembly
> If Not _oType.GetInterface("GIAUBE.iPlugin") Is
Nothing
> Then
> 'Plug-in trouvé !
> Try
> Dim _Obj As Object > > AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(_sPlug,
> "GIAUBE.iPlugin") 'XXXXXXXX ERREUR !!! :-((
> MsgBox(CType(_Obj,


GIAUBE.iPlugin).Libellé())
> '<<<<<====== ICI TEST POUR VERIF BON FONCTIONNEMENT
> Catch ex As Exception
> MsgBox(ex.Message)
> End Try
> End If
> Next
> Catch ex As Exception
> 'Rien
> End Try
> Next
>
> End Sub
>



############################################################################
> ################
>
> À chaque fois il me claque un message "Le constructeur sur le type
> GIAUBE.iPlugin est introuvable", alors que j'ai bien un constructeur
(bidon,
> certes) dans ma classe implémentant mon interface !!! (dont voici le


code)
>
>



############################################################################
> ################
> Namespace GIAUBE
>
> Public Class clsGITravaux
> Implements iPlugin
>
> '--Constructeur
> Public Sub New()
>
> End Sub
>
> '-- Retourne la description du module en cours
> Public Function Description() As String Implements
> iPlugin.Description
> Return "Saisie et édition de vos temps de travaux"
> End Function
>
> 'Retourne l'icône représentative du module
> Public Function Icone() As System.Drawing.Image Implements
> iPlugin.Icone
>
> 'Déclaration des variables locales
> Dim _asm As System.Reflection.Assembly > > System.Reflection.Assembly.GetExecutingAssembly
> Dim _img As Image > >



Bitmap.FromStream(_asm.GetManifestResourceStream("GITravaux._travaux.ico"))
>
> Return _img 'Retourne l'image intégrée
>
> _img.Dispose() 'Libération des ressources
>
> End Function
>
> 'Retourne l'identifiant du module
> Public Function IDPlugin() As Integer Implements


iPlugin.IDPlugin
> Return 105
> End Function
>
> 'Retourne le libellé du module
> Public Function Libellé() As String Implements iPlugin.Libellé
> Return "Travaux"
> End Function
>
> 'Exécute la fonctionnalité associée au module
> Public Sub Run(ByVal IDAgent As Integer) Implements iPlugin.Run
>
> 'Déclaration des variables locales
> Dim _oTravaux As New frmTrav(IDAgent) 'Objet formulaire
> travaux
>
> _oTravaux.ShowDialog() 'Affichage de la
fenêtre
> de saisie
>
> _oTravaux.Dispose() 'Sortie "propre"
>
> End Sub
>
> End Class
>
> End Namespace
>



############################################################################
> ################
>
>
> Qqu'un pourrait m'aider sur ce coup-là ?...
>
> Plus simplement, peut-on facilement instancier une assembly (dans mon
code,
> directement à partir de l'objet _oAss, au niveau de mon erreur) ?
>
> MERCI
>
> --
> Cédric Girard
> OCERA CFGA (Aube)
> Mon site perso : http://www.mainecoon.fr
>
>




Avatar
Zazar
Bonjour,

Il faut bien caster vers l'interface utilisée par mes plugins, non ?



Oui mais il faut faire attention à un point de détail important : l'assembly
qui charge les plugins et les plugins doivent connaître la même interface.
Si par exemple vous avez copié/collé le code de votre interface et qu'il se
trouve en double dans les assemblies, alors les 2 interfaces sont
considérées comme étant 2 classes différentes. Pour éviter ceci, le plus
simple est de créer une assembly contenant votre interface et d'utiliser des
références à cette assembly.

--
Zazar
Avatar
Cédric Girard
Ahhhhhhhhhhhhhhhhhhhh

MERCI !!!!!!! Je teste de suite cette solution qui paraît logique (honte à
moi... Mais pourquoi n'y avais-je pas pensé plus tôt !!!)

--
Cédric Girard
OCERA CFGA (Aube)
Mon site perso : http://www.mainecoon.fr
"Zazar" a écrit dans le message
de news:%
Bonjour,

> Il faut bien caster vers l'interface utilisée par mes plugins, non ?

Oui mais il faut faire attention à un point de détail important :


l'assembly
qui charge les plugins et les plugins doivent connaître la même interface.
Si par exemple vous avez copié/collé le code de votre interface et qu'il


se
trouve en double dans les assemblies, alors les 2 interfaces sont
considérées comme étant 2 classes différentes. Pour éviter ceci, le plus
simple est de créer une assembly contenant votre interface et d'utiliser


des
références à cette assembly.

--
Zazar