Dynamic Link Library’s (DLL’s) in vb.NET Erstellen

    • VB.NET

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Mircosofter2206.

      Dynamic Link Library’s (DLL’s) in vb.NET Erstellen

      stellt. Zunächst will ich euch aber erst ein mal zeigen was eine DLL eigentlich ist.

      Der Zweck von DLL-Dateien ist, den von einer Anwendung auf der Festplatte und im Hauptspeicher benötigten Speicherplatz zu reduzieren. Jeglicher Programmcode, der von mehr als einer Anwendung benötigt werden könnte, wird deshalb in einer einzelnen Datei auf der Festplatte gespeichert und nur einmal in den Hauptspeicher geladen, wenn mehrere Programme dieselbe Programmbibliothek benötigen.
      Vorteile:
      • Sie spart Arbeitsspeicher und reduziert die Auslagerung. Eine einzelne DLL kann von vielen Prozessen gleichzeitig verwendet werden. Dabei wird eine einzelne, in den Arbeitsspeicher geladene Kopie der DLL gemeinsam genutzt. Im Gegensatz dazu muss Windows für jede mit einer Static Link Library erstellte Anwendung eine Kopie des Bibliothekscodes in den Arbeitsspeicher laden.
      • Sie spart Festplattenspeicher. Viele Anwendungen können eine einzelne, auf der Festplatte gespeicherte Kopie der DLL gemeinsam nutzen. Im Gegensatz dazu wird für jede Anwendung, die mit einer Static Link Library erstellt wurde, der Bibliothekscode als separate Kopie in deren ausführbares Bild eingebunden.
      • Sie vereinfacht die Aktualisierung der DLL. Wenn sich die Funktionen in einer DLL ändern, müssen die Anwendungen, die diese DLL verwenden, nicht neu kompiliert oder neu verknüpft werden, solange sich die Argumente und Rückgabewerte der Funktion nicht ändern. Im Gegensatz dazu erfordert ein statisch verknüpfter Objektcode, dass die Anwendung neu verknüpft wird, wenn sich die Funktionen ändern.
      • Sie ermöglicht die Unterstützung nach der Vermarktung. Eine Treiber-DLL für ein Anzeigegerät kann z. B. so geändert werden, dass ein Gerät unterstützt wird, das zum Zeitpunkt der Auslieferung der Anwendung noch gar nicht verfügbar war.
      • Sie unterstützt mehrere Programmiersprachen. Programme, die in verschiedenen Programmiersprachen erstellt wurden, können dieselbe DLL-Funktion aufrufen, solange sie die Aufrufkonvention der Funktion einhalten. Die Programme und die DLL-Funktion müssen in folgenden Punkten kompatibel sein: die von der Funktion erwartete Reihenfolge, in der Argumente auf den Stapel verschoben werden, ob die Funktion oder die Anwendung für das Bereinigen des Stapels verantwortlich ist und ob Argumente in Registern übergeben werden.
      • Sie bietet einen Mechanismus zur Erweiterung der MFC-Bibliotheksklassen. Sie können Klassen von bestehenden MFC-Klassen ableiten und diese in einer MFC-Erweiterungs-DLL speichern, die dann von MFC-Anwendungen genutzt werden kann.
      • Sie erleichtert die Erstellung von internationalen Versionen. Das Erstellen internationaler Anwendungsversionen wird erheblich vereinfacht, wenn Sie Ressourcen in einer DLL speichern. Sie können die Zeichenfolgen für jede Sprachversion der Anwendung in einer separaten Ressourcen-DLL speichern und die Versionen so einrichten, dass jede Sprachversion ihre eigenen Ressourcen lädt.

      Mehr muss man zu einer DLL eigentlich nicht wissen, deswegen fangen wir jetzt auch mal direkt an. =)

      Ihr Startet Visual Basic .NET und Erstellt eine neue Klassenbibliothek.



      Nach dem ihr die Klassenbibliothek Erstellt habt wurde automatisch eine Class (Klasse) dem Projekt hinzugefügt die ihr einfach "Test" nennt.

      Jetzt haben wir alles so weit eingerichtet das wir endlich mit dem Programmieren der DLL anfangen können. Der erste schritt den wir einleiten ist das wir die nötigen Imports machen.

      VB.NET-Quellcode

      1. Imports System.Runtime.InteropServices
      2. Public Class Test
      3. End Class


      Der Import System.Runtime.InteropServices ist dafür da, das wir nachher auch auf DLL zugreifen können.

      Jetzt Erstellen wir in der Klasse eine Sub, wo wir dann drin Programmieren werden.

      VB.NET-Quellcode

      1. Imports System.Runtime.InteropServices
      2. Public Class Test
      3. Public Sub About()
      4. End Sub
      5. End Class



      Somit wir nachher aber auf die Klasse und auf die Member der Klasse zugreifen können müssen wir sie noch mit Hilfe des Importierten System.Runtime.InteropServices sichtbar machen.

      VB.NET-Quellcode

      1. Imports System.Runtime.InteropServices
      2. <Microsoft.VisualBasic.ComClass()> _
      3. Public Class Test
      4. <System.Runtime.InteropServices.ComVisible(True)> _
      5. Public Sub About()
      6. End Sub
      7. End Class


      Wie ihr anhand des Namens der Sub schon sehen könnt bauen wir als erstes eine AboutForm die nachher ganz bequem aus einem anderen Programm heraus aufgerufen werden kann.

      Dafür müssen wir eine Form zu der DLL hinzufügen, das ihr ganz einfach mit "Neues Element Hinzufügen" machen könnt. (Eine einfache Windows Form)


      Den Dateiname von der "Form1.vb" macht ihr jetzt bitte in "frmAbout.vb".

      Nun könnt ihr mit hilfe von Labeln eure Kontaktdaten, Webseiten, ect auf die AboutForm machen. Natürlich könnt ihr auch Bilder mittels der PictureBox einfügen. (Ihr müsst nur darauf achten das ihr die Bilder als Ressource mitliefert.)

      Hier habe ich mal ein Bild von meiner Test AboutForm:

      Wenn ich euch noch ein paar Einstellungen von der frmAbount Form ans Herz legen darf dann wären das:
      • StartPosition: Center Screen (So mit die Form IMMER beim aufruf in der mitte ist.)
      • FormBorderStyle: Fixed3D (So mit man die Form nicht mehr größer &amp; kleiner machen kann wenn die Form aufgerufen wurde.
      Was für einige vielleicht noch interessant sein dürfte ist die Transparenz der Form. Manche empfinden es als Optisches plus wenn die Form minimal Transparenz wirkt. (z.B: Opacity 90%)

      Jetzt müssen wir noch dafür sorgen das die Form auch erscheint wenn man die Funktion in der DLL aufruft. Dafür gehen wir zurück in unsere Klasse wo wir schon alles für den Code vorbereiten haben.

      Unsere frmAbout aufzurufen erfordert nur 2 Befehle.

      VB.NET-Quellcode

      1. Imports System.Runtime.InteropServices
      2. <Microsoft.VisualBasic.ComClass()> _
      3. Public Class Test
      4. Dim AboutForm As New frmAbout
      5. <System.Runtime.InteropServices.ComVisible(True)> _
      6. Public Sub About()
      7. AboutForm.Show()
      8. End Sub
      9. End Class


      Jetzt geht ihr oben auf in Visual Basic .NET oben auf "Erstellen" und Erstellt die DLL. Fertig, alles ist vollbracht und die DLL ist bereit zum testen. =) (Vergesst nicht das Projekt zu Speicher - Wichtig!)

      Nun Erstellt ihr ein neues Projekt (Windows Form-Anwendung), und geht direkt oben auf "Projekt" und dann auf "Verweis Hinzufügen".



      Dort geht ihr oben auf dem Reiter "Durchsuchen" und wählt eure DLL aus. (Bei mir ist sie unter: C:\Users\Papa\Documents\Visual Studio 2008\Projects\TutorialDLL\TutorialDLL\bin\Release) Nachdem ihr das gemacht habt geht ihr in euer Code-Fenster.

      VB.NET-Quellcode

      1. Public Class Form1
      2. Dim MeineDLL As New TutorialDLL.Test
      3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      4. MeineDLL.About()
      5. End Sub
      6. End Class


      Bei "Dim MeineDLL As New TutorialDLL.Test" steht das TutorialDLL für den Namen der Datei, und das Test ist die klasse in userer DLL.

      Im Form_Loadhaben wir dann einfach nur noch mit MeineDLL die About Form aufgerufen.

      Das war es auch schon in diesem Tutorial, und ich werde für DLL's noch ein 2tes Schreiben, was sich dann mehr auf Funktionen bezieht und wie man ordentlich mit einer DLL und dessen Variablen Kommunizieren kann.

      lg, Igoe
      Liebe Grüße,
      C.O.D.E

      Testautomatisierung (TA):

      5%
      Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
      Gibt es auch eine möglichkeit die subs untereinander zu verwenden? Damit das Funktioniert, muss ich die subs als Shared deklarieren, dann funktioniert das mit der DLL aber wiederum nicht; dazu muss die sub als public deklariert sein. Hast du da eine Idee?