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 :

Associer un handle (en VB.NET) sur un Event (en C#) : OLA !


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 337
    Billets dans le blog
    1
    Par défaut Associer un handle (en VB.NET) sur un Event (en C#) : OLA !
    Bonjour,

    Si vous avez une quelconque information sur le sujet suivant, je suis preneur !

    Sous Visual Studio (2010), j'ai une solution multiprojets :

    - avec du C#, et notamment une classe avec des Events qui m'intéressent,

    - et une fonction que je souhaite associer à un de ces Event, qui est codé est VB.NET.

    Comment faire ? Enfin surtout : Est-ce possible ?
    Peut-on faire l'association en VB.NET d'une méthode/fonction avec un event dans une classe codé en C# ?

    Merci pour toutes pistes...

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut appeler un handler vb.net de c#
    bonjour
    De .net framework à .net framework c'est possible.
    Attention aux marshalling des types dans les arguments entre vb.net et c#.
    Les types "blittatables" savoir les types valeurs int,double,string boolean ne posent pas de probleme.
    Les types "personnalises" (classe,structure) en argument doivent "mappes" correctement pour se correspondre dans les 2 languages.
    Attention au passage par adresse et valeur qui doit etre precise explicitement dans les "wrapper" vb.net à savoir :
    - byval passage par valeur
    - byref passage par adresse(ou reference)
    Attention à la porte en VB.Net c'est du public.

    voici un exemple:
    code c#:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
     
    //classe AlarmClass  avec evenement
     
    using System;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace WindowsFormsApplication1
    {
     
        class AlarmClass
        {
            // Declare the delegate 
             public delegate void AlarmHandler(string s);
            // Declare the event member that is of type AlarmEventHandler.
             public event AlarmHandler Alarm;
            public AlarmClass()
            {
     
            }
            public void Starting()
            {
                string msg = "hello c#";
                OnAlarm(msg);
            }
            // Define a method that raises an event.
            protected virtual void OnAlarm(string s)
            {
                // Instantiate the delegate.
                AlarmHandler handler = Alarm; 
                if (handler != null) 
                { 
                   // Invokes the delegates. 
                   handler( s); 
                }
            }
        }
    }
     
    // Forme pour initialiser AlarmClass
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    //REFERENCE AU Projet Biblio VB.NET
    using ClassLibVbNet;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private  AlarmClass objAlarm;
            public Form1()
            {
                InitializeComponent();
               this.objAlarm=new AlarmClass();
               //Declaration du Nouveau Handler comme pour un handler en c#
               this.objAlarm.Alarm += new AlarmClass.AlarmHandler(ClassLibVbNet.Module1.vbAlarm);
     
            }
     
            private void btnEventVB_Click(object sender, EventArgs e)
            {
                this.objAlarm.Starting();
            }
     
    }
    code projet librairie vb.net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Imports System.Windows.Forms
    'Portee :Public pour l'acces
    Public Module Module1
        'Passage de string par valeur
        'Portee :Public 
        Public Sub vbAlarm(ByVal s As String)
            MessageBox.Show("vb.net " & s)
        End Sub
    End Module
    bon code....

  3. #3
    Membre très actif

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 337
    Billets dans le blog
    1
    Par défaut Ok
    Merci pour ta réponse, je vais travailller dessus.

    Reste la question du "mapping" des types personnalisés , c'est pour moi une opération inconnue

    --------------------------------------- Edit

    ta solution est nickel. Merci encore.

    Mais je galère pour l'appliquer, n'étant pas encore familier avec les solutions multiprojets !

    J'ai ajouter un nouveau projet VB dans la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Namespace Kennedy.ModuleVB
        Public Module Module1
            Public Sub Main()
                MsgBox("Hello World !")
            End Sub
        End Module
    End Namespace
    Mais ce dernier est introuvable dans le projet en C#, un indice ?


  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 337
    Billets dans le blog
    1
    Par défaut
    Solution trouvée :

    clique droit sur "References" dans le projet en C# :
    Ajout du module en VB.

    Et voila, il est reconnu dans le code.

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut namespace en double ?
    bonjour
    est -ce que ce n'est pas dù à Namespace Kennedy.ModuleVB en double.
    Car Vb.Net mets automatiquement le Namespace dans Projet->Proprietes->Application->espace de nom racine.
    Si tu tapes le Namespace dans le code ,il faut le supprimer de proprietes du projet, sinon il sera double .
    Et le projet c# va s'attendre à quelque chose comme ceci:
    - Namespace Kennedy.ModuleVB. Namespace Kennedy.ModuleVB

    Ce n'est pas comme en C# ou il est mis une seule fois dans le code.
    Ambiguite de Vb.Net qui fait pas mal de chose "derriere les coulisses".
    Pour le mapping des "types perso" il s'agit du cas d'evenement plus complexe ou l'argument d'evenement est une classe de type EventArgs.
    Dans ce cas la on ne peut pas simplement referencer la proc VB et faut l'appeler simplement dans une procedure de gestion d'evenement C# .
    Voici un exemple:

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    //Exemple de classe EventArgs et "mapping"
     
    using System;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace WindowsFormsApplication1
    {
        // Version de Classe Alarm revue avec des arguments Evenement plus complexe. 
        // Cette classe est celle qui publie l'evenement.Qu'on se le dise.  
        public class AlarmClass2
        {
            // Declare  delegate revue à cause de l'argument evenement
            public delegate void AlarmHandlerPerso(persoEventArgs e);
     
            // Declare  event member that is of type AlarmEventHandler.
            public event AlarmHandlerPerso AlarmPerso;
             //public event AlarmHandler Alarm;
            public AlarmClass2()
            {
     
            }
            public void StartingPerso()
            {
                persoEventArgs persArgs =new persoEventArgs();
                persArgs.monMessage = "je vous appele de Hello c#";
                persArgs.DateEmission = DateTime.Now;
                OnAlarmPerso(persArgs);
            }
            // Define a method that raises an event.
            protected virtual void OnAlarmPerso(persoEventArgs p)
            {
                // Instantiate the delegate.
                AlarmHandlerPerso handler = AlarmPerso; 
                if (handler != null) 
                { 
                   // Invokes the delegates. 
                   handler( p); 
                }
            }
        }
        // Definit une Classe Ad-Hoc  persoEventArgs qui genere les info 
        // d'un evenement plus "consistant".
        // herite de EventArgs
        public class persoEventArgs : EventArgs
        {
            public persoEventArgs()
            {
            }
            private string msg;
            private DateTime  dtEmission;
            public string monMessage
            {
                get { return msg; }
                set { msg = value; }
            }
            public DateTime DateEmission
            {
                get { return dtEmission; }
                set { dtEmission = value; }
            }
        }
     
    }
     
    // Forme pour tester AlarmClass2
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    //reference au projet biblio vb.net
    using ClassLibVbNet;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            private AlarmClass2 objAlarm;
     
            public Form2()
            {
                InitializeComponent();
                this.objAlarm = new AlarmClass2();
                //IL FAUT WRAPPER SUR UNE METHODE C# AlarmPerso
                this.objAlarm.AlarmPerso += AlarmPerso;
     
                //CECI EST REJETE PAR LE COMPILER 
                //this.objAlarm.AlarmPerso += new AlarmClass2.AlarmHandlerPerso(Module2.vbAlarmPerso(ref ArgsVB));
            }
     
            private void btnEventVB_Click(object sender, System.EventArgs e)
            {
                this.objAlarm.StartingPerso();
            }
            private void AlarmPerso(persoEventArgs e)
            {
                //La classe persoEventArgs est "mappe" avec 
                //son homologue Vb.NetpersoEventArgsVB
                 Module2.persoEventArgsVB ArgsVB;
                ArgsVB = new Module2.persoEventArgsVB();
                ArgsVB.monMessage = e.monMessage;
                ArgsVB.DateEmission = e.DateEmission;
                //Appel de la methode gestionnaire d'evenement Vb.Net
                Module2.vbAlarmPerso(ArgsVB);
     
            }
        }
    }
    code dans le module VB.NET revu avec "mapping":

    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
     
    Imports System.Windows.Forms
    'Portee :Public pour l'acces
    Public Module Module2
        'Passage d'argument de type Classe par valeur
        'Portee :Public 
        Public Sub vbAlarmPerso(ByVal e As persoEventArgsVB)
            MessageBox.Show(e.monMessage & "Emis le : " & e.DateEmission.ToShortDateString & " OK Vb.Net bien recu...")
        End Sub
        'Classe persoEventArgsVB qui "mappe"   persoEventArgs  
        'Portee :Public pour exposer l'argument
        Public Class persoEventArgsVB
            Inherits EventArgs
            Private dtEmission As Date
            Private msg As String
            Public Sub New()
            End Sub
            Public Property monMessage() As String
                Get
                    Return msg
                End Get
                Set(ByVal value As String)
                    msg = value
                End Set
            End Property
            Public Property DateEmission() As Date
                Get
                    Return dtEmission
                End Get
                Set(ByVal value As Date)
                    dtEmission = value
                End Set
            End Property
        End Class
    End Module
    N.B: remarque comment je n'ai pas mis les "NameSpace" dans la declaration du module .Vb.Net l'a fais pour moi en coulisse.
    En C# ceci est impardonnable et fais "warner" le compiler.
    bon code...

  6. #6
    Membre très actif

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 337
    Billets dans le blog
    1
    Par défaut
    Ok génial, j'ai appris plein de trucs. Merci

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

Discussions similaires

  1. [VBA-A] correspondance du "Handles" de VB.Net
    Par eultartuffe dans le forum VBA Access
    Réponses: 1
    Dernier message: 13/04/2006, 22h13
  2. [ADO.NET]Sur quels critères utiliser procédures stockées?
    Par Oberown dans le forum Accès aux données
    Réponses: 3
    Dernier message: 06/04/2006, 16h16
  3. [xmlrad] utiliser du vb.net sur un bouton
    Par ekmule dans le forum XMLRAD
    Réponses: 6
    Dernier message: 24/01/2006, 13h20

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