Events in DLL

  • VB.NET
  • .NET 4.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    kannst du denn ühaupt schon ein Event erstellen - also ohne dll?

    Weil deine Wortwahl ist schon sehr eigenartig. Weil Events erstellt man nicht in dlls, sondern man programmiert Klassen, die Events enthalten Und die Klassen programmiert man auch nicht in einer Dll, sondern in einem Projekt. Jo, und das Projekt kann man kompilieren, wenn als "Klassenbibliothek" eingestellt kommt eine Dll bei raus.

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

    @ErfinderDesRades Jou.
    @pc-werkstatt

    VB.NET-Quellcode

    1. ' In der Klasse:
    2. Public Event MyEvent(sender As Object, e As AnyEventargs)
    3. ' in der Prozedur
    4. RausEvent MyEvent(Me, New AnyEventargs(WHAT_EVER))
    Verarbeitet wird es genau so, wie Du z.B. ein Button_Click-Event organisierst.
    Die empfangende Klasse muss das Event abonieren:

    VB.NET-Quellcode

    1. Private Sub MyEventHandler(sender As Object, e As AnyEventargs) Handles KLASS_NAME.MyEvent
    2. ' was tun
    3. End Sub
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Wusste nicht wie man die Events von der DLL in dem Programm abruft! :D

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Dim NewVersion As String
    4. 'Events
    5. Event UpdateIsAvailable()
    6. Event UpdateIsNotAvailable()
    7. Private Sub SearchforUpdate(ByVal VersionTextfileURL As String, ByVal MyVersion As String)
    8. 'Aktuellste version abfragen
    9. Dim Verbindung As New WebClient
    10. NewVersion = Replace(Verbindung.DownloadString(VersionTextfileURL), ".", "")
    11. If NewVersion > MyVersion Then
    12. RaiseEvent UpdateIsAvailable()
    13. ElseIf NewVersion = MyVersion Then
    14. RaiseEvent UpdateIsNotAvailable()
    15. End If
    16. End Sub


    Demnach wäre das so richtig?
    Formal ist das wohl richtig, aber inhaltlich? Das Auslösen eines Events ist wie etwas auf nem schwarzen Brett zu hinterlassen. So ungefähr: "Falls es jemanden interessiert: Hier eine Mitteilung von mir." Ob es sinnvoll ist, ein Event auszulösen, wenn ein Update nicht verfügbar ist, musst Du wissen. Es wär in diesem Beispiel ggf. sinnvoller, eine Property mit einem passenden Wert zu versehen (z.B. UpdateIsAvailable) und diese abzurufen. Das UpdateIsAvailable-Event hingegen kann ich nachvollziehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed,

    ​halte die Benachrichtigung in beiden Fällen schön für Sinnvoll.
    ​Ist wohl am Ende eine Design-Frage.

    Alternativ könnte ich mir vorstellen den Status Ja, nein, vielleicht in den Eventargs mitzugeben und nur ein Event für beide Fälle zu verwenden.
    ​Benachrichtigen würde ich aber auf jedenfall.

    Eine Property alleine würde mir nicht reichen.
    Will ja die Abfrage vielleicht Asynchron laufen lassen.

    ​Gruss

    ​mikeb69
    @VaporiZed Ich pflichte Dir bei.
    @pc-werkstatt Solch Herangehen ist suboptimal.
    Irgend jemand ruft doch die Prozedur auf, die die Events sendet.
    Mach daraus eine Funktion mit dem Rückgabewert Boolean, der Dir sagt, dass ein Update erforderlich ist oder nicht.
    Ein Event ist dafür da, ausgelöst zu werden, wenn zur Laufzeit etwas passiert.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    Mach daraus eine Funktion mit dem Rückgabewert Boolean, der Dir sagt, dass ein Update erforderlich ist oder nicht.


    VB.NET-Quellcode

    1. Public Function UpdateCheck(ByVal UC_URL As String, ByVal UC_Version As Integer) As Boolean
    2. Dim UC_Verbindung As New WebClient
    3. Dim NewVersion As Integer = Replace(UC_Verbindung.DownloadString(UC_URL), ".", "")
    4. If NewVersion > UC_Version Then
    5. Return True
    6. ElseIf NewVersion = UC_Version Then
    7. Return False
    8. ElseIf NewVersion < UC_Version Then
    9. Return False
    10. End If
    11. End Function


    Verstehe nur nicht genau warum Visual Studio mir das sagt:
    Warnung 1 Die UpdateCheck-Funktion gibt nicht für alle Codepfade einen Wert zurück. Fehlt eine Return-Anweisung?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „pc-werkstatt“ ()

    Jap, da fehlt was. Allerdings nur für den Compiler, nicht für Deine Logik. Schreib vor Dein End Function ein Return False, fertig. Oder einen für Dich überflüssigen Else-Teil. Dann ist der Compiler auch zufrieden. Einfacher Test:

    VB.NET-Quellcode

    1. Private Function foo(bar As Boolean) As Boolean
    2. If bar Then
    3. Return True
    4. ElseIf Not bar Then
    5. Return False
    6. End If
    7. 'Return False
    8. End Function

    schlägt mit der auskommentierten Zeile auch an. Ändert man das ElseIf Not bar in Else ist alles ok. Dass dieses Beispiel in keinem Projekt was zu suchen hat, versteht sich von selbst, schließlich ließe sich der ganze Funktionsaufruf zu einem Return bar kürzen. Aber es geht ja um die Denkweise des Compilers ;)
    -> @pc-werkstatt: Ersetze Dein If-Konstrukt durch ein Return NewVersion > UC_Version
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    und noch mein Senf dazu:

    VB.NET-Quellcode

    1. Public Function UpdateCheck(ByVal UC_URL As String, ByVal UC_Version As Integer) As Boolean
    2. Dim UC_Verbindung As New WebClient
    3. Dim NewVersion As Integer = Replace(UC_Verbindung.DownloadString(UC_URL), ".", "")
    4. End Function
    Ups - nee - erstmal mach Option Strict On!
    Und schmeiss den Deppen-Namespace raus! Visual Studio - Empfohlene Einstellungen

    (und lass das mit der dll erstmal noch - da sind scheints noch jede Menge Grundlagen nachzuholen)
    @VaporiZed Jou.

    pc-werkstatt schrieb:

    Fehlt eine Return-Anweisung?
    Logisch gesehen hast Du alle Möglichkeiten erwischt:
    Größer, Kleiner und Gleich.
    Dies wird aber vom Compiler nicht abgetestet, sondern nur, dass ein einfacher Else-Zewig fehlt oder dass zwischen End If und End Function halt kein Return steht.
    Besser ist es halt, immer einen Else-Zweig stehen zu haben oder es gleich gut zu machen:

    VB.NET-Quellcode

    1. Return (NewVersion > UC_Version)

    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hi
    gemäß den Konventionen sollte man Events stets mit EventHandler definieren:

    VB.NET-Quellcode

    1. Public Event MyGenericEvent As EventHandler(Of MyEventArgs)
    2. Public Event MyEvent As EventHandler

    Im anderen Fall nach meinem Stand (VB.Net mit .Net-Version 2.0) sollte auch ein unnötiger Delegatentyp generiert werden.

    Viele Grüße
    ~blaz€~