Dll + System.Reflection

Résolu
hayk83 Messages postés 8 Date d'inscription mercredi 29 août 2012 Statut Membre Dernière intervention 18 novembre 2013 - 8 sept. 2013 à 22:01
hayk83 Messages postés 8 Date d'inscription mercredi 29 août 2012 Statut Membre Dernière intervention 18 novembre 2013 - 13 sept. 2013 à 21:02
Bonjour,

Je cherche a passé l''événement button click du dll à mon application
>si je travail normalement c'est simple
Le code dans dll :
Public Event _addDefault(ByVal sender As Object, ByVal e As EventArgs)
    Private Sub addB_Click(sender As Object, e As EventArgs) Handles addB2.Click
        RaiseEvent _addDefault(Me, e)
    End Sub

Et dans mon application :
Friend _class As New MaclassdanslaDLL
Friend WithEvents MySender As MaclassdanslaDLL = _class
    Private Sub Buttonadd_Click(sender As Object, e As EventArgs) Handles MySender._addDefault
        _class.AddDefaultFrm(New DefaultForm, Nothing)
    End Sub

>Le problème ma Dll n'est pas au même répertoire que mon application exe alors j'utilise
Imports System.Reflection

La class Library et la méthode GetAssemblyInstance font tous ce qui faut faire pour crée une instance du class du mon dll
Et voila le code dans mon application :
Friend _class As Object= Library.GetAssemblyInstance("Nom du DLL", "Nom du Class")
Friend WithEvents MySender As Object = _class
    Private Sub Buttonadd_Click(sender As Object, e As EventArgs) Handles MySender._addDefault
        MDItabpresentation.AddDefaultFrm(New DefaultForm, Nothing)
    End Sub

>>>le problème lorsque je change MySender comme object je perdre _addDefault
Erreur 1 L'événement '_addDefault' est introuvable.

SVP comment je peux dépasser ce problème
merci

--

8 réponses

Utilisateur anonyme
11 sept. 2013 à 20:29
Voici donc une méthode simple adaptée à ton cas pour réaliser un plugin (dll chargée dynamiquement).

J'utilise une interface qui fera le lien entre l'application et les dll à charger dynamiquement.
Cette interface devra être référencée d'une part sur l'application et d'autre part sur la ou les dll à charger.

Voici le code de l'interface (a mettre dans un projet vierge) :

Public Interface IMonInterface
    'événement clic pour le bouton
    Event MonEvent(ByVal sender As Object, ByVal e As EventArgs)
    'affichage du formulaire dll
    Sub Affiche()
End Interface



Et voici le code de la dll (dans un projet vierge également) :
Note rassurante: L'ide visual basic écrit lui-même la plus grosse partie du code dès lors qu'on tape Inherits et Implements.
Il faudra quand même référencer System.Widows.Forms et System.Drawing manuellement dans les propriétés du projet.

Imports MonInterface
Imports System.Windows.Forms
Imports System.Drawing

Public Class Madll
    'hérite de Form
    Inherits Form
    'implémente l'interface
    Implements IMonInterface

    Friend WithEvents Button1 As System.Windows.Forms.Button

    Public Event MonEvent(ByVal sender As Object, ByVal e As System.EventArgs) Implements MonInterface.IMonInterface.MonEvent

    Sub New()
        InitializeComponent()
    End Sub

    Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button()
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(85, 77)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(75, 23)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Button1"
        Me.Button1.UseVisualStyleBackColor = True
        '
        'Madll
        '
        Me.ClientSize = New System.Drawing.Size(284, 262)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Madll"
        Me.ResumeLayout(False)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        RaiseEvent MonEvent(sender, e)
    End Sub

    Public Sub Affiche() Implements MonInterface.IMonInterface.Affiche
        Me.Show()
    End Sub
End Class


Et enfin le code de l'application (dans un 3eme projet vierge) :

Imports MonInterface
Imports System.Reflection 
Public Class Form1

    Dim WithEvents Plugin As IMonInterface

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim asm As Assembly = Assembly.LoadFrom("chemin_de_la_dll\MaDll.dll")

        Dim mesTypes() As System.Type = asm.GetTypes()
        Dim monType As System.Type = Nothing
        For Each tp As Type In mesTypes
            If tp.Name.StartsWith("Madll") Then
                monType = asm.GetType(tp.FullName)
                Exit For
            End If
        Next
        Dim assign As Boolean = GetType(IMonInterface).IsAssignableFrom(monType)
        If assign Then
            Plugin = CType(Activator.CreateInstance(monType), IMonInterface)
            'on abonne ici l'événement du bouton
            AddHandler Plugin.MonEvent, AddressOf SubMonEvent
            'on affiche le formulaire de la dll
            Plugin.Affiche()
            'note que l'événement 'MonEvent' ainsi que la sub
            'Affiche() apparaissent tous deux dans l'interface
        End If
    End Sub

    'sub exécutée lors du clic sur le bouton du formulaire dll
    Private Sub SubMonEvent(ByVal sender As Object, ByVal e As EventArgs)
        MessageBox.Show("le bouton dll a été pressé")
    End Sub

End Class
2
Utilisateur anonyme
12 sept. 2013 à 23:37
Commence par définir ton interface en premier (méthodes, propriétés, fonctions, événements...) . Ensuite, comme je l'ai mentionné plus haut, l'ide de visual basic écrira seul la plus grande partie du code de ta dll dès lors que tu tapera
Implements ITonInterface
dans ta ou tes dll.
1
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 sept. 2013 à 23:08
Bonsoir,

Je ne comprend vraiment pourquoi tu fais si compliqué, mais regardes l'instruction AddHandler.
0
hayk83 Messages postés 8 Date d'inscription mercredi 29 août 2012 Statut Membre Dernière intervention 18 novembre 2013
9 sept. 2013 à 22:32
merci NHenry
Le problème c'est comment déclarer une variable avec type/class qui existe dans la dll
Friend WithEvents MySender As
class x qui existe dans la dll
Mon but c'est toujours passé l'événement button click du dll à mon application et la dll n'existe pas au même répertoire que mon Application.
S'il existe une autre méthode pour attendre mon but Svp aidez-moi
merci


--
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
9 sept. 2013 à 23:06
Comme dit précédemment, intéresses-toi à AddHandler :
http://msdn.microsoft.com/fr-fr/library/7taxzxka%28v=vs.90%29.aspx
0

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

Posez votre question
Utilisateur anonyme
9 sept. 2013 à 23:36
Salut,

Tu tentes de faire un 'plugin' ?

Un bonjour à NHenry ;)
0
hayk83 Messages postés 8 Date d'inscription mercredi 29 août 2012 Statut Membre Dernière intervention 18 novembre 2013
10 sept. 2013 à 22:31
Salut
Merci NHenry ceci améliore ma méthode de passer un Event mais toujours le même problème c'est toujours la déclaration de type Object qui est le problème.. je pense !
Public Class Form1
    Private dllClass As Object
    Private AppPath As String = "path du Dll"
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler dllClass._addDefault, AddressOf EventHandler
        dllClass = GetAssemblyInstance("Nom du DLL", "Nom du Class")
    End Sub
    Public Function GetAssemblyInstance(ByVal dllName As String, ByVal className As String) As Object
        Dim TYP As Type
        Dim fullPath As String = AppPath & dllName & ".dll"
        If System.IO.File.Exists(fullPath) Then
            Dim asm As Assembly = Assembly.LoadFrom(fullPath)
            TYP = asm.GetType(dllName & "." & className)
            Return Activator.CreateInstance(TYP)
        End If
        Return Nothing
    End Function
    Sub EventHandler()
        ' Handle the event.
        MsgBox("EventHandler caught event.")
    End Sub
End Class

Dans la DLL:
Public Class Class1
    ' Declare an event.
    Public Event Ev_Event()
    Sub CauseSomeEvent()
        ' Raise an event.
        RaiseEvent Ev_Event()
    End Sub
End Class

Erreur 1 '_addDefault' n'est pas un événement de 'Object'.
Et je ne peut pas déclaré
Private dllClass As New Class1
(le type Class1 est inaccesible) car j'utilise
Imports System.Reflection.
Merci
Banana32 , 'plugin' ??? mais après une petite recherche je pense que oui il s'agit du plugin et j'essai de passer un event button Click du dll au programme principale
Merci


--
0
hayk83 Messages postés 8 Date d'inscription mercredi 29 août 2012 Statut Membre Dernière intervention 18 novembre 2013
12 sept. 2013 à 21:49
Merci banana32 pour le simple exemple. C'été très utile pour moi ,merci.
J'ai un très compliquer plugin.pour confirmer...
Peut être je dois reprogrammer la dll/ le plugin de nouveau
merci


--
0
hayk83 Messages postés 8 Date d'inscription mercredi 29 août 2012 Statut Membre Dernière intervention 18 novembre 2013
13 sept. 2013 à 21:02
Bonjour,
ok merci de votre aide banana32

--
0
Rejoignez-nous