Dll + System.Reflection [Résolu]

hayk83 8 Messages postés mercredi 29 août 2012Date d'inscription 18 novembre 2013 Dernière intervention - 8 sept. 2013 à 22:01 - Dernière réponse : hayk83 8 Messages postés mercredi 29 août 2012Date d'inscription 18 novembre 2013 Dernière intervention
- 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

--
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Utilisateur anonyme - 11 sept. 2013 à 20:29
1
Merci
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

Merci Utilisateur anonyme 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
Utilisateur anonyme - 12 sept. 2013 à 23:37
1
Merci
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.

Merci Utilisateur anonyme 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
NHenry 14250 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 10 août 2018 Dernière intervention - 8 sept. 2013 à 23:08
0
Merci
Bonsoir,

Je ne comprend vraiment pourquoi tu fais si compliqué, mais regardes l'instruction AddHandler.
Commenter la réponse de NHenry
hayk83 8 Messages postés mercredi 29 août 2012Date d'inscription 18 novembre 2013 Dernière intervention - 9 sept. 2013 à 22:32
0
Merci
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


--
NHenry 14250 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 10 août 2018 Dernière intervention - 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
Commenter la réponse de hayk83
Utilisateur anonyme - 9 sept. 2013 à 23:36
0
Merci
Salut,

Tu tentes de faire un 'plugin' ?

Un bonjour à NHenry ;)
Commenter la réponse de Utilisateur anonyme
hayk83 8 Messages postés mercredi 29 août 2012Date d'inscription 18 novembre 2013 Dernière intervention - 10 sept. 2013 à 22:31
0
Merci
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


--
Commenter la réponse de hayk83
hayk83 8 Messages postés mercredi 29 août 2012Date d'inscription 18 novembre 2013 Dernière intervention - 12 sept. 2013 à 21:49
0
Merci
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


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

--
Commenter la réponse de hayk83

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.