AddHandler sur un objet de type Object ? Pas si simple apparement...

Piloutech Messages postés 16 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 avril 2010 - 2 avril 2010 à 10:51
Piloutech Messages postés 16 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 avril 2010 - 6 avril 2010 à 14:15
Bonjour à tous,

Voici ma situation :
je gère des plugins sous forme d'objet, et donc pour me simplifier la vie et aussi ne pas retoucher l'application principale à chaque nouveau plugin j'utilise le type 'Object' de cette manière :

[code=vb]For Each aPlug as Object in PluginArr
       Try
            aPlug.TempPath = PluginTempPath
       Catch ex As Exception
       End Try
Next


Pour chaque plugin, j'essaie l'appel d'une fonction générique. Si l'appel n'aboutis pas, c'est que le plug n'a pas cette méthode et il passe alors a la suivante.

Par contre pour les events, c'est une autre histoire

Try
         AddHandler content.monEvenement, AddressOf content_monEvenement
Catch ex As Exception
End Try


me retourne 'monEvenement' n'est pas un évenement de 'Object'...

Avez vous une idée de comment je pourrais faire ?

Merci d'avance.

Piloutech/code
A voir également:

5 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 avril 2010 à 08:36
pas propre de coder ca en se basant sur les exceptions...


faire plutot:

    Private Sub Event_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MessageBox.Show("Hello !")
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim aPlug As Object = Button1
        If aPlug.GetType().GetMethod("OpenDoor") Is Nothing Then
            MessageBox.Show("La methode OpenDoor n'existe pas.")
        Else
            MessageBox.Show("La methode OpenDoor existe bien !!!")
        End If

        If aPlug.GetType().GetMethod("Select") Is Nothing Then
            MessageBox.Show("La methode Select n'existe pas.")
        Else
            MessageBox.Show("La methode Select existe bien !!!")
        End If

        Dim tEvent As Reflection.EventInfo = aPlug.GetType().GetEvent("Click")
        If tEvent Is Nothing Then
            MessageBox.Show("L'evenement Click n'existe pas.")
        Else
            MessageBox.Show("L'evenement Click existe bien !!!")
            Dim tEventType As Type = tEvent.EventHandlerType
            aPlug.GetType().GetEvent("Click").AddEventHandler(aPlug, [Delegate].CreateDelegate(tEventType, Me, "Event_Click"))
        End If
    End Sub



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Piloutech Messages postés 16 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 12:36
Un tout grand merci pour ton code qui m'a permis de rendre mon code plus propre ;)

J'ai encore un tout petit problème.

J'ai une dll (plugin externe a rajouter dans le rep de mon appli principale)

Public Class f_main
Public Event PutInQueuelist(ByVal handledres As ArrayList)
Private Sub BGo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BGo.Click
       dim arrHandleResults as new arraylist
       RaiseEvent PutInQueuelist(arrHandleResults)
    End Sub
End class

J'ai une classe plugin dans mon appli principal avec un event (Que j'utilise pour reconstruire l'object plugin externe)
Public Class Plugin
Public Event OnDocumentToPutInQueuelist(ByVal documents As ArrayList)
Public Sub Event_PutInQueuelist(ByVal handledres As ArrayList)
        RaiseEvent OnDocumentToPutInQueuelist(handledres)
End Sub
End Class


Et dans mon appli principale, je reconstruit l'object plugin, et je veux que l'object reconstruit ecoute l'évenement du plugin externe et raise son propre event...

Dim pluginObj As New Plugin
Dim f_mainType As Type = SRA.GetType(SRA.GetName.Name & ".f_main", False, True)
Dim tEvent As Reflection.EventInfo = f_mainType.GetEvent("PutInQueuelist")
If tEvent IsNot Nothing Then
Dim tEventType As Type = tEvent.EventHandlerType
tEvent.AddEventHandler(pluginObj, [Delegate].CreateDelegate(tEventType, pluginObj, "Event_PutInQueuelist"))
 End If    


Seulement j'ai une exception sur tEvent.AddEventHandler : "L'objet ne correspond pas au type cible."... Les signatures de l'event sont identiques dans la dll externe pourtnat.

Public Event PutInQueuelist(ByVal handledres As ArrayList)


et dans ma classe interne :

Public Event OnDocumentToPutInQueuelist(ByVal documents As ArrayList)


Qu'ai-je raté ?

Un tout grand merci d'avance.

Piloutech
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 avril 2010 à 12:43
je ne sais pas trop....

es tu sur de cette ligne :

Dim f_mainType As Type = SRA.GetType(SRA.GetName.Name & ".f_main", False, True)

?


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Piloutech Messages postés 16 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 13:45
Je suis certain...
Tous semble correct en pas à pas, jusque cette ligne ou apparemment il y a un problème de cast...

Pourtant un par une étape en plus, cela reprend exactement la logique de ton exemple. C'est surement une bêtise... Mais c'est les bêtises les plus dur à trouver en général mdr ;)

Piloutech
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Piloutech Messages postés 16 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 14:15
Après avoir un peu aéré, je précise que c'est la dernière ligne qui lève l'exception:

Dim tEventType As Type = tEvent.EventHandlerType
Dim tEventDeleguate As [Delegate] = [Delegate].CreateDelegate(tEventType, pluginObj, "Event_PutInQueuelist")
tEvent.AddEventHandler(pluginObj, tEventDeleguate)


et que, en debug, après la 2ème ligne :

tEventDeleguate.Target = MonApp.Plugin
pluginObj.GetType()= MonApp.Plugin

Piloutech
0
Rejoignez-nous