IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Probleme de programmation modulaire


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut Probleme de programmation modulaire
    Bonjour tout le monde !

    Je développe actuellement une application en VB.NET avec des DLL chargé dynamiquement dans le programme. C'est DLL ont une interface en commun contenant les prototypes des événements et des fonctions. Les événements sont levées dans la DLL, et détectées et traitées dans l'application principale.

    Le problème que je rencontre est le suivant : la création d'une classe implémentant l'interface commune à la DLL ne lève pas les événements handlées dans l'application principale. Le seul moyen que j'ai trouvé pour pouvoir communiquer est de créer une fonction intermédiaire en shared qui lève un événement intermédiaire aussi en shared qui appelle une autre fonction non partagée qui lève à sont tour l’événement voulue.

    J'aimerai donc savoir si il n'y a pas une façon plus propre au niveau du code pour pouvoir communiquer avec l'application.

    Merci d'avance de vos réponses. Bien entendu, si vous désirez davantage de précisions, n'hésitez pas !

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Legarsdelouest Voir le message
    Le problème que je rencontre est le suivant : la création d'une classe implémentant l'interface commune à la DLL ne lève pas les événements handlées dans l'application principale.
    C'est bien là le problème. Peut être qu'un peu de ton code ne serait pas superflu

  3. #3
    Membre confirmé Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Oui bien sur

    Voici le code permettant de récupérer les plugins et de les encapsuler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Public PluginCollection as New SortedList
            Public Sub Initialisation(ByVal PluginPath As String)
            'Chargement des plugins
            Dim NewPlugIn As PluginManager.PluginManagerClass.CommonInterface
            Dim PluginsPath As New List(Of String)
     
            Dim Files As New Collections.ObjectModel.ReadOnlyCollection(Of String)(My.Computer.FileSystem.GetFiles(PluginPath))
     
     
            For i = 0 To Files.Count - 1
                If Files(i).EndsWith(".dll") Or Files(i).EndsWith(".DLL") Then
                    PluginsPath.Add(Files(i))
                End If
            Next
     
     
            For i = 0 To PluginsPath.Count - 1
                Try
                    Dim PlugInAssembly As Reflection.Assembly = Reflection.Assembly.LoadFile(PluginsPath(i))
     
                    Dim Types() As Type
                    Dim FoundInterface As Type
                    Types = PlugInAssembly.GetTypes
     
                    For Each PlugInType As Type In Types
                        FoundInterface = PlugInType.GetInterface("CommonInterface")
                        If FoundInterface IsNot Nothing Then
                            NewPlugIn = DirectCast(PlugInAssembly.CreateInstance(PlugInType.FullName), PluginManager.PluginManagerClass.CommonInterface)
                            PluginCollection.Add(NewPlugIn.GetPluginName, NewPlugIn)
                            Exit For
                        End If
                    Next
     
                Catch ex As Exception
     
                End Try
            Next
     
            Dim s As String = ""
     
        End Sub

    Le code pour handler les évènements levées par le plugin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'Mise en place des handlers d'évènements
            For i = 0 To PluginsManager.GetPluginsCollection.Count - 1
                Dim Plugin As PluginManager.PluginManagerClass.CommonInterface = PluginsManager.GetPluginsCollection.GetByIndex(i)
                AddHandler Plugin.ESay, AddressOf Speaker.Speak
                AddHandler Plugin.EAction, AddressOf DoubleAgentManager.ChangeMotion
                AddHandler Plugin.EShowForm, AddressOf DoubleAgentManager.ShowForm
                AddHandler Plugin.EStopSpeak, AddressOf DoubleAgentManager.StopSpeaking
                Plugin.Ignition()
            Next

    Enfin le code pour lever l'exeption
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim Main As New Main
            Main.RaiseESay("Hello World")
    La classe Main implémente l'interface suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
        Public Interface CommonInterface
            Sub Ignition()
            Function GetPluginName() As String
            Function GetPluginAuthor() As String
            Function GetPluginVersion() As String
            Function GetKeysWords() As List(Of String)
            Function AcceptCIM() As Boolean
            Function GetCIMType() As PluginTypeEnum
            Sub Processing(ByVal UserInput As String)
            Function IsMaster() As Boolean
            Event ELog(ByVal Message As String)
            Event EError(ByVal Message As String)
            Event ESay(ByVal Phrase As String)
            Event EStopSpeak()
    End Interface
    La classe Main comprend en plus une fonction RaiseESay(Byval Phrase as String) qui lève juste l'évènement ESay.

    Je pense que le soucis vient de l'initialisation d'une nouvelle classe Main. Cette dernière implémente les évènements de l'interface, mais ces dernière étant différentes des évènements handlées précédemment par le programme, elle ne servent à rien !

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Question bête: Connais tu MEF ? C'est typiquement ce que tu essaies de réinventer, l'avantage c'est qu'il marche bien

  5. #5
    Membre confirmé Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Réponse bête : non, je ne connais pas. Mais j'ai fais un petit tour sur le net et je suis tombé sur un document très complet ici, ainsi que sur la MSDN. Je vais regarder sa de plus près, mais sa m'a l'air beaucoup plus simple que ce que j'utilise actuellement. Merci pour l'info !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. petit probleme en programmation modulaire .
    Par elmcherqui dans le forum C
    Réponses: 3
    Dernier message: 24/11/2008, 15h59
  2. Probleme execution programme
    Par jmjmjm dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/11/2005, 19h32
  3. Réponses: 2
    Dernier message: 31/05/2005, 09h50
  4. [TP]Problème de programme exécutable en mode graphique
    Par GoodVibe dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 24/09/2004, 09h47
  5. [Kylix] probleme execution programme
    Par vin's dans le forum EDI
    Réponses: 1
    Dernier message: 31/03/2004, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo