Event von c# Klassenbibliothek abonieren

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Event von c# Klassenbibliothek abonieren

    Guten Abend,

    ich versuche im Moment einen Event einer c# .dll zu abonieren.

    VB.NET-Quellcode

    1. Dim varName As NameSpace.Class
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. varName = New NameSpace.Class
    4. AddHandler varName.Event, AddressOf Me.Sub
    5. End Sub


    Leider wird mir das ganze mit der Fehlermeldung "Event" ist kein Ereigniss von "NameSpace.Class" quitiert. Ich habe dazu leider nichts brauchbares im Internet gefunden. Unter c# lässt sich der Event problemlos abonieren. Ich hoffe das mir jemand der mehr von Vb versteht als ich, auf die sprünge helfen kann.

    *Edit*

    Fehler tritt in Zeile 4 auf.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    Zeig' mal den Code bitte, wie er in echt aussieht.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Meine Kristallkugel flüstert was von wegen "falscher access modifier des Events", aber sie könnte mich auch anlügen... :saint:
    Form1

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim vbTestDll As VbTest.MyCSharp
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. vbTestDll = New VbTest.MyCSharp
    5. AddHandler vbTestDll.OnNewTick, AddressOf OnNewTick
    6. End Sub
    7. Private Sub OnNewTick(sender As Object, e As VbTest.EventArgs)
    8. End Sub
    9. End Class


    Klassenbibliothek

    C#-Quellcode

    1. public class MyCSharp
    2. {
    3. public EventHandler<EventArgs.NewTick> OnNewTick;
    4. protected virtual void NewTick(int tick)
    5. {
    6. if (OnNewTick != null)
    7. OnNewTick(this, new EventArgs.NewTick(tick));
    8. }
    9. System.Timers.Timer timer;
    10. int iTicks = 0;
    11. public MyCSharp()
    12. {
    13. timer = new System.Timers.Timer();
    14. }
    15. private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    16. {
    17. iTicks++;
    18. NewTick(iTicks);
    19. }
    20. }


    EventArgs

    C#-Quellcode

    1. public class EventArgs
    2. {
    3. public class NewTick : System.EventArgs
    4. {
    5. public int Tick { get; private set; }
    6. public NewTick(int tick)
    7. {
    8. this.Tick = tick;
    9. }
    10. }
    11. }

    Bilder
    • preview.png

      21,75 kB, 753×274, 35 mal angesehen
    Irgendwas ist hier faul.

    C#-Quellcode

    1. public EventHandler<EventArgs.NewTick> OnNewTick;

    Die Signatur des Handlers muss dann void Foo(Object sender, EventArgs.NewTick e) bzw. Sub Foo(sender As Object, e As EventArgs.NewTick) sein.
    Achte auf den e-Parameter.
    Du hast in VB aber VbTest.EventArgs. Das kann, egal wie man es dreht und wendet, niemals das selbe sein wie EventArgs.NewTick.

    Und ich bin jetzt auch schon drauf gekommen, wo das Problem liegt. Du hast in der DLL zwar den Delegaten deklariert, aber du hast vergessen, dazuzuschreiben, dass es ein Event sein soll.
    Es würde auch helfen, wenn Du Dich an die Namenskonventionen halten würdest. Deshalb hier ein Beispiel, wie es aussehen sollte:

    C#-Quellcode

    1. namespace MyLibrary
    2. {
    3. // Die Klassen müssen natürlich nicht in der selben Datei sein, aber es geht darum, wo die EventArgs-Klasse liegt.
    4. public class TickEventArgs : EventArgs
    5. {
    6. // ...
    7. }
    8. public class FrobnicationTimer
    9. {
    10. public event EventHandler<TickEventArgs> Tick;
    11. protected virtual void OnTick(TickEventArgs e)
    12. {
    13. if (Tick != null) Tick(this, e);
    14. }
    15. private void Frobnicate()
    16. {
    17. while (FrobnicationStatus.IsFrobnicatable)
    18. {
    19. OnTick(new TickEventArgs(/*...*/));
    20. }
    21. }
    22. }
    23. }

    Natürlich ist es möglich, die TickEventArgs-Klasse in einem anderen Namespace zu haben oder sogar in der FrobnicationTimer-Klasse geschachtelt, aber da das nur verwirren würde, sollte man es so lassen. Was aber nicht geht, ist eine eigene Klasse EventArgs zu nennen. Das würde extrem verwirren.

    So. Jetzt sollte bei der Verwendung klar sein, was wie verwendet werden muss.

    VB.NET-Quellcode

    1. ' Möglichkeit 1:
    2. Dim Frobnicator As MyLibrary.FrobnicationTimer
    3. Private Sub Foo()
    4. Frobnicator = New MyLibrary.FrobnicationTimer
    5. AddHandler Frobnicator.Tick, AddressOf Frobnicator_Tick
    6. End Sub
    7. Private Sub Frobnicator_Tick(sender As Object, e As MyLibrary.TickEventArgs)
    8. e.Irgendwas
    9. End Sub
    10. ' Möglichkeit 1:
    11. Dim WithEvents Frobnicator As MyLibrary.FrobnicationTimer
    12. Private Sub Foo()
    13. Frobnicator = New MyLibrary.FrobnicationTimer
    14. End Sub
    15. Private Sub Frobnicator_Tick(sender As Object, e As MyLibrary.TickEventArgs) Handles Frobnicator.Tick
    16. e.Irgendwas
    17. End Sub
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ihr hattet beide recht ich hab das Schlüßelwort vergessen.

    Was aber nicht geht, ist eine eigene Klasse EventArgs zu nennen

    Das mache ich seit Jahren so und da nur ich meine Anwendungen warten muss, sehe ich hier auch keine Probleme.

    Danke für die Hilfe.
    @Fakiz Es sieht so aus, als wäre Deine EventArgs-Klasse etwas verkorkst, solst würde Dir die IDE die richtige Lösung anbieten.
    Mach mal aus der Klasse in Post #6

    C#-Quellcode

    1. public class EventArgs
    einfach einen entsprechenden NameSpace und es sollte wieder per IDE gehen:

    C#-Quellcode

    1. namespace EventArgs
    2. {
    3. public class NewTick : System.EventArgs
    4. {
    5. public int Tick { get; private set; }
    6. public NewTick(int tick)
    7. {
    8. this.Tick = tick;
    9. }
    10. }
    11. }

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Fakiz schrieb:

    Das mache ich seit Jahren so und da nur ich meine Anwendungen warten muss, sehe ich hier auch keine Probleme.
    Dadurch wirds auch nicht besser.

    Was hindert dich daran, deine EventArgs vernünftig zu benennen?
    EventArgs ist definitiv unvernünftig benannt, denn eine EventArgs-Klasse gibts schon.

    Was Niko vorgemacht hat, ist doch ziemlich perfekt - würde das den iwelche Umstände machen?