DLL-Datei richtig erstellen, aber wie?!

  • Allgemein

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

    DLL-Datei richtig erstellen, aber wie?!

    Hey Leute!

    Ich hätte mal eine Frage, weiß allerdings nicht wie ich es formulieren soll!
    Hab mir schon einige DLL´s gemacht (zum leichteren Arbeiten)

    Jetzt möchte ich aber gerne mal wissen, wie man sowas in seiner DLL einbaut:
    Ist jetzt nur ein Beispiel Anhand Youtube, is nix besseres eingefallen:)

    VB.NET-Quellcode

    1. Dim vid As new YoutubeKlasse("youtubelink") 'hier möchte ich eine neue Klasse erstellen mit einen enthaltenen Wert
    2. Dim ID As String = vid.GetID 'das soll die Funktion sein in der DLL
    3. Dim TITLE As String = vid.GetTitle 'das ebenso eine Funktion

    So wie muss ich jetzt das in YoutubeKlasse schreiben, damit ich es in meinen Programm so aufrufen kann?!

    Bis jetzt hab ich nur Funtionen die ich so aufrufen kann:

    VB.NET-Quellcode

    1. Dim ID As String = YoutubeKlasse.GetID("youtubelink")
    2. Dim Title As strng = YoutubeKlasse.GetTitle("youtubelink")


    Wie ihr seht muss ich jedesmal den Youtube-Link eingeben, das möchte ich gerne vermeiden!


    Ich hab bis jetzt kaum so richtig mit DLL´s gearbeitet, deswegen weiß ich auch nicht nach was ich so richtig muss...

    Danke im Voraus

    VB.NET-Quellcode

    1. Public Class YoutubeKlasse
    2. Public Sub New(Byval tLink as string)
    3. VideoLink = tLink
    4. end Sub
    5. Public Property VideoLink as string =""
    6. Public Function GetID as String
    7. 'mache iwas mit VideoLink
    8. return ergebnis
    9. end Function
    10. '...
    11. End Class


    So in etwa^^ VideoLink könnte auch noch ReadOnly sein oder Private, damit man es von "außen" nicht ändern kann. lg

    Edit: Wobei das hier natürlich quatsch ist: Für das laden dieser Informationen muss immer ein Internetzugriff erfolgen. Sinnvoll wäre es beim erstellen der instanz alle informationen auszulesen (Internetzzugriff) und in Klassen-Properties abzulegen. So wird nur einmal geladen und alle Informationen sind bei zukünftigen zugrifffen sofort verfügbar.
    wenn kein Wert übergeben werden soll - was ja afaik deine anforderung war - nein xD Du kannst ja mit dem Wert der Property "VideoLink" arbeiten.

    YT war hier eine brisante Beispielwahl - zum Thema Klassenbau kann man viel mehr sagen:
    - Vererbung/Interfaces
    - Shared Functions
    - SIchtbarkeiten
    - Properties (ReadOnly, etc)
    - Events
    - Operatoren
    - Konstruktor
    - Überladungen
    - Überschreiben von z.B. der .ToString-methode
    - etc
    Ok habs getestet, so wollt ich das haben, danke dir:)

    Und so kann man dann schon komplett alles holen aus den Vid:

    VB.NET-Quellcode

    1. Public Class YoutubeClass
    2. Public Sub New(byval YoutubeURL as string)
    3. youtubelink = YoutubeURL
    4. 'funktionen zur id auslesen
    5. youtubeid = funktionen
    6. End Sub
    7. private property youtubelink as string = ""
    8. private property youtubeid as string = ""
    9. public shared function GetID() as string
    10. return youtubeid
    11. end function
    12. End Class


    So kann ich es dann realisieren, wenn ich schon beim Deklarieren der Sub New(), das ich nur einmal die Infos abfrage und dann zB. "nur" mit einen Button aufrufen?!
    Oder ist das völlig falsch?!
    doch - genau so ist es. Allerdings würde ich die private Properties zu Public ReadOnly Properties machen, dann kannst du dir die Funktion GetID sparen. Shared kann die Funktion btw eh nicht sein, das ist blödsinn und sollte einen fehler werfen^^

    Wichtig zu wissen: es gibt eine ausführliche form um Properties zu erstellen. Das ist wichtig, denn sonst könntest du einer ReadOnly-Prop keinen Wert zuweisen, da sie eben readonly ist:

    VB.NET-Quellcode

    1. private _Value as string = "standart"
    2. Public ReadOnly Property Value as string
    3. Get
    4. Return _Value
    5. End Get
    6. end Property


    Verändern kannst du nur _Value! Die Property, die diese Variable kapselt kann selbst nur gelesen werden. Da _Value private ist kann nur Klassenintern darauf zugegriffen werden.

    VB.NET-Quellcode

    1. Public Class YoutubeClass
    2. Public Sub New(byval YoutubeURL as string)
    3. _YoutubeLink = YoutubeURL
    4. _VideoID=GetVideoID 'videoID heruasfinden
    5. end Sub
    6. private _YoutubeLink as string = ""
    7. Public ReadOnly Property YoutubeLink as string
    8. Get
    9. Return _YoutubeLink
    10. End Get
    11. end Property
    12. private _VideoID as string = ""
    13. Public ReadOnly Property VideoID as string
    14. Get
    15. Return _VideoID
    16. End Get
    17. end Property
    18. Private Function GetVideoID as string
    19. 'mache iwas mit YouTubeLink
    20. return ergebnis
    21. end function
    22. End Class

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

    Ok, ganz dumm bin ich anscheinend auch nicht:)

    So dann aber noch was... Muss ich dann komplett alle Funktionen die ich machen will, in Sub New() schreiben?!

    Oder kann ich auch so machen:

    VB.NET-Quellcode

    1. Public Sub New(byval YoutubeURL as string)
    2. youtubelink = YoutubeURL
    3. youtubeid = GetID_start()
    4. End Sub
    5. 'hier die Änderung
    6. public function GetID_start() as string
    7. dim id as string = ""
    8. 'schreib schreib schreib^^
    9. return id
    10. end function
    11. private property youtubelink as string = ""
    12. private property youtubeid as string = ""
    13. public shared function GetID() as string
    14. return youtubeid
    15. end function


    Die Frage ist, wird dann diese GetID_start() Funktion auch mit angezeigt oder nur die wirklich nur die Shared-Funktionen?!
    Nicht das der User zweimal GetID drin stehen hat, könnt verwirrend sein...

    Und noch was, wenn ich alles auf einmal mit der Sub New mache, wird ja ne Zeit lang brauchen!
    Kann man in einer Lib Threads mit einbauen oder ist es sinnvoll im Programm selber mit Threads zu arbeiten?!

    Edit: ok hab übersehen das du es auch schon so geschrieben hast, danke

    Bleibt nur noch das mit den Threads...

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

    Habe meinen letzten Post editiert, nur als Info^^

    GetID_start könnte eine Private Function sein (siehe mein Code: private function getID). Auf die weise "siehst" du die Funktion nur Klassenintern - von außerhalb aber nicht. intern ist dann etwas gewusel, du wirst damit zurechkommen. Nach außen sieht es aufgeräumt aus.

    Um das Problem mit der Wartezeit in angriff zu nehmen erfordert es schon mehr Wissen - es gibt außerdem mehrere Möglichkeiten:

    1) Klassenintern wird das lesen der InternetInfos in einem eigenen Thread erledigt. Problem: Der Programmfluss wird gestört weil die Klasse "fertig" ist aber noch nicht alle Infos da sind. Wenn du das allerdings berücksichtigst wird es keine Probleme geben.

    2) Du könntest auch mit Events arbeiten: Wenn alle Informationen komplett sind, dann wird ein Event gefeuert und das Hauptprogramm bekommt erst dann die Instanz der YoutubeKlasse übergeben. Eine weitere Klasse die sich darum kümmert könnte sinnvoll sein. Das wäre jedenfalls mein Lösungsweg^^
    => Du sagst der Klasse: Lade YT-Video xy und melde dich wenn du fertig bist!

    Vorteil von 1 ist, dass die Instanz sofort da ist - bei 2 erst nachdem alle Infos geladen sind. Es gibt sicher noch weitere herangehensweisen (z.b. Threads im Hauptprogramm, was aber bei sowas finde ich unschön ist). Async-Proggen ist nicht sooo mein Fachgebiet (picoflop kennt sich da afaik gut aus) und imo auch etwas zuviel für den Anfang^^

    Bei beiden sind Events ein unerlässliches Mittel!
    Ist auch eine Idee, hast Recht!
    Ich arbeite widerrum gern mit Threads:)

    Aber das ist jeden das seine, würd ich sagen!

    Ich werde mal sehen wie ich lösen werde... die Lib soll ja den User das arbeiten erleichtern und nicht zusätzlich mit Threads arbeiten, deswegen hat sich das scho mal erledigt:)

    So schwer wird das nun auch wieder nicht sein!
    Solang man was dabei lernt, soll mir das Recht sein!

    Dann danke ich dir erstmal vielmals...
    Vermischt ihr zwei da nicht gerade was?

    Sub New() = Instanzklasse
    Shared Sub = ohne Instanz

    Somit kann die Shared Sub gar nicht auf die internen Member zugreiffen. (VS sollte sogar einen Fehler anzeigen!)


    Meine Idee hierfür:

    VB.NET-Quellcode

    1. Class youtube
    2. Private _YoutubeLink As String = String.Empty
    3. 'Youtubelink wäre in diesem Fall Public, da man diesen von aussen auch noch ändern können sollte, oder?
    4. Public Property YoutubeLink As String
    5. Get
    6. Return _YoutubeLink
    7. End Get
    8. Set(value As String)
    9. _YoutubeLink = value
    10. GetID_start()
    11. End Set
    12. End Property
    13. Private _YoutubeID As String = String.Empty
    14. 'Das auslesen soll hier Public sein, das schreiben Private.
    15. Public Property YoutubeID As String
    16. Get
    17. Return _YoutubeID
    18. End Get
    19. Private Set(value As String)
    20. _YoutubeID = value
    21. End Set
    22. End Property
    23. ' Initialisierung der Instanz
    24. Public Sub New(ByVal YoutubeURL As String)
    25. YoutubeLink = YoutubeURL
    26. GetID_start()
    27. End Sub
    28. 'Private, ausser der Programmierer soll diese Methode auch von ausserhalb anwenden können
    29. Private Sub GetID_start()
    30. Dim id As String = ""
    31. 'schreib schreib schreib^^
    32. YoutubeID = id
    33. End Sub
    34. End Class
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D