Evènement d'une DLL C# utilisé en VB access 2003

Rayzerger - 8 févr. 2013 à 17:37
 Rayzerger - 11 févr. 2013 à 09:13
Bonjour, à tous.

Je vous explique ce que je souhaite faire, alors je veux faire une dll écrite en C# (Visual Studio 2012)et l'utiliser en VB Access. Ma dll C# génère des évènements que je veux donc aussi utiliser en VB Access 2003.

J'ai donc créé une dll exposé à COM avec une interface (pour pouvoir l'utiliser sur VB Access)et disposant d'évènement, que j'ai ensuite testé en console pour voir si la dll fonctionne avec les évènements. Puis la même dll sans les évènements pour tester cette dernière sur VB Access. Et d'après mes testes et ma compréhension cela fonctionne.

Un peu de code pour voir ? (C'est le test console et le résultat est un affichage "C'est bon !!!" toutes les trois secondes)
class Program
    {
        static void Main()
        {
            IMetronome m = new Metronome();
            m.Tick += new TickHandler(afficheEvent);
            m.Start();
 
        }
        private static void afficheEvent(object sender, ClassEventArgs e)
        {
            Console.WriteLine(e.MyEvent);
        }
}

public delegate void TickHandler(Metronome m, ClassEventArgs e);
 
    [ComVisible(true)]
    [Guid("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IMetronome
    {
 
        event TickHandler Tick;
        void Start();
    }
 
    [Guid("936DA01F-9ABD-4d9d-80C7-02AF85C822A8")]
    public class Metronome : IMetronome
    {
        public event TickHandler Tick;
 
        public void Start()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(3000);
                if (Tick != null)
                {
                    ClassEventArgs e = new ClassEventArgs("c est bon !!");
                    Tick(this, e);
                }
            }
        }
    }

public class ClassEventArgs : EventArgs
    {
        private string myEvent = null;
 
        public ClassEventArgs(string theEventText)
        {
            if (theEventText == null) throw new NullReferenceException();
            myEvent = theEventText;
        }
 
        public string MyEvent
        {
            get { return this.myEvent; }
        }
    }


Dans ma dll C# il y a les deux classes (Metronome et ClassEventArgs).

Pour utiliser cette dll sur VB Access (sur un autre ordinateur), je génère un fichier .reg avec un RegAsm à partir du fichier dll.

J'enregistre la dll à l'aide d'un gacutil -i.

Et pour finir le fichier .tlb je l'ajoute dans les références du projet de VB Access, jusque là tout va bien.


Maintenant je veux utiliser ma dll c# sur VB Access je fais alors:

Dim obj As IMetronome
Set obj = New Metronome


Et là c'est le drame je me retrouve avec un obj.add_Tick et un obj.remove_Tick, j'ai donc fait une supposition que .add_Tick correspond au += en C# et .remove_Tick au -= , cela permet de s'abonner et de se désabonner. Mais je n'arrive pas à les utiliser car je pense qu'il faut aussi créer une méthode qui va être appelé au moment de l'évènement.

Je viens donc vers vous pour trouvez de l'aide sur l'utilisation de ces deux méthodes .add_Tick et .remove_Tick et pour création de la méthode qui va être appelée lors de l'évènement.

Merci d'avance pour vos réponses, une question ? Nécessitez pas à me la poser.

3 réponses

Whismeril Messages postés 17823 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2022 618
8 févr. 2013 à 18:01
Bonsoir finalement ta question c'est plutôt du VBA.


Whismeril
0
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
8 févr. 2013 à 18:37
Bonjour,

Pour faire simple, il est plus facile de créer un contrôle personnalisé qui sera sur une UserForm, et ensuite d'utiliser l’événement reçu.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Bonjour,
Merci pour vos réponses, je vais tester ce que vous me proposez. Et je vous tien au courant.

PS: Désolé si la rubrique où j'ai posté ce message n'est pas approprié, je vais voir si je peux changer cela.
0