hallo,
die Frage lautet, wie erstelle ich ein PlugIn System unter VB.NET.
Ich will dies hier anhand einer kleinen Anwendung zeigen.
Verwenden werde ich das Framework 2 - im Framework 3.5 gibt es dafür einen eigenen Namespace !
Wobei der hier gezeigte weg auch im Framework 3 und 3.5 angewendet werden kann.
Zuerst erstellen wir uns eine WindowsForms Anwendung.
Dieser wird unser Host, welche die PlugIns lädt und steuert.
Das Problem bei einem PlugIn System (oder die Idee welche dahintersteckt) ist doch folgendes.
Wie kann ich eine Anwendung schreiben, die Problemlos erweiterbar ist, ohne jedesmal die exe verändern zu müssen.
Z.B. wenn viele Entwickler Teile zum ganzen beitragen wollen, aber nicht jeder den Quellcode der eigentlichen exe haben kann.
Dafür benötigen wir eine Schnittstelle, die die Kommunikation zwischen dem Host (exe) und den Clients (PlugIn dll's) regelt.
Für unser Beispiel hab ich mir gedacht, Rechnen wir einfach mal einbischen.
OK - Dann wollen wir beginnen.
Die Form benötigt folgende Steuerelemente
2 x ListBox (ListBox1 und ListBox2)
3 x Label (Label1, Label2,Label3)
1 x Button
Ich denke soweit ist alles klar, wie man die Steuerelemente platziert sollte ja kein Problem darstellen.
Nun zur Schnittstelle.
Fügen wir nun zu unserem Host Projekt ein weiteres eigenständiges Projekt hinzu.
Dies geht im Datei-Menü unter Hinzufügen (Add) eines neuen Projektes.
Nennen Sie das neue Projekt z.B. Interface
Dafür müssen wir unser Host Projekt mindestens schon einmal gespeichert haben.
OK - da die Schnittstelle eine eigene DLL werden soll erstellen wir nun eine Klassenbibliothek.
Nennen Sie diese z.B. MyInterface.vb
In dieser Klassenbibliothek führen wir alle öffentlichen Funktionen, Subs oder Properties auf.
Hier der Code für unsere Beispiel Schnittstelle.
soweit so gut.
Um nun diese Schnittstelle sichtbar zu machen müssen wir diese einmal kompilieren.
Nach dem kompilieren fügen wir unserer Host-Anwendung einen Verweis zum Interface hinzu.
Dies geht am Einfachsten im Menü Projekt -> Verweis hinzufügen
Dort suchen Sie die Interface Dll - diese befindet sich im Interface Projekt Ordner unter Release
Jetzt zum Client.
Der Client ist ebenfalls eine Dll.
Also - wieder dem Projekt ein neues Projekt hinzufügen - und wieder eine Klassenbibliothek.
Der Client muss natürlich auch etwas vom Interface wissen.
Setzen Sie auch hier einen Verweis auf die Interface dll.
Nun zum Code des Client (PlugIn)
Normalerweise sollte, sobald sie
eingegeben haben, die IDE alle öffentlichen Member - aus dem Interface - selbstständig eintragen.
geschieht dies nicht, macht das auch nichts. Dann machen wir es eben von Hand.
Was jetzt noch fehlt ist der Code unserer Host Anwendung.
Diese besteht aus der Form und einer Klasse zum laden der Dll's
Hier erstmal der Code für die Form
So nun zum interessanten Teil der Host-Anwendung.
Fügen sie zu Ihrem Projekt eine neue Klasse hinzu und nennen Sie diese
PlugInConnector.vb
Zu dieser Klasse gehört folgender Code.
Ich hoffe, dass ich diesen ausreichend Kommentiert habe, sodass keine Fragen dazu auftreten sollten.
Hinweis1:
Sie sollten sich einen Ordner anlegen, indem sie alle PlugIn Dll's sammeln.
In unserem Beispiel ist das der Anwendungsordner.
Bei dieser Art von Anwendung, kann man den Debugger nur sinnvoll nutzen, wenn man nach jeder Codeänderung im
Client (PlugIn) diesen neu kompilieren lässt.
Standardmäßig wird die erzeugte Dll dann im eigenen Projekt im Debug oder Release Ordner abgelegt.
Dies bedeutet weiterhin, dass wir dann jedesmal die kompilierte Dll in unseren PlugIn Ordner kopieren müssen.
Um dies zu vermeiden tragen wir am besten unseren PlugIn Ordner als Ausgabeort in den Projekteigenschaften ein.
Hinweis2:
Ich würde gerne ein paar Screenshots hinzufügen, jedoch kann ich im moment nicht auf meine Homepage zugreifen,
das das Hotel hier diese Art der Verbindung nicht erlaubt.
Deshalb bitte geduld bis nächste Woche, da bin ich dann wieder daheim.
Nun viel Spass beim PlugIn entwickeln
Gruss
mikeb69
die Frage lautet, wie erstelle ich ein PlugIn System unter VB.NET.
Ich will dies hier anhand einer kleinen Anwendung zeigen.
Verwenden werde ich das Framework 2 - im Framework 3.5 gibt es dafür einen eigenen Namespace !
Wobei der hier gezeigte weg auch im Framework 3 und 3.5 angewendet werden kann.
Zuerst erstellen wir uns eine WindowsForms Anwendung.
Dieser wird unser Host, welche die PlugIns lädt und steuert.
Das Problem bei einem PlugIn System (oder die Idee welche dahintersteckt) ist doch folgendes.
Wie kann ich eine Anwendung schreiben, die Problemlos erweiterbar ist, ohne jedesmal die exe verändern zu müssen.
Z.B. wenn viele Entwickler Teile zum ganzen beitragen wollen, aber nicht jeder den Quellcode der eigentlichen exe haben kann.
Dafür benötigen wir eine Schnittstelle, die die Kommunikation zwischen dem Host (exe) und den Clients (PlugIn dll's) regelt.
Für unser Beispiel hab ich mir gedacht, Rechnen wir einfach mal einbischen.
OK - Dann wollen wir beginnen.
Die Form benötigt folgende Steuerelemente
2 x ListBox (ListBox1 und ListBox2)
3 x Label (Label1, Label2,Label3)
1 x Button
Ich denke soweit ist alles klar, wie man die Steuerelemente platziert sollte ja kein Problem darstellen.
Nun zur Schnittstelle.
Fügen wir nun zu unserem Host Projekt ein weiteres eigenständiges Projekt hinzu.
Dies geht im Datei-Menü unter Hinzufügen (Add) eines neuen Projektes.
Nennen Sie das neue Projekt z.B. Interface
Dafür müssen wir unser Host Projekt mindestens schon einmal gespeichert haben.

OK - da die Schnittstelle eine eigene DLL werden soll erstellen wir nun eine Klassenbibliothek.
Nennen Sie diese z.B. MyInterface.vb
In dieser Klassenbibliothek führen wir alle öffentlichen Funktionen, Subs oder Properties auf.
Hier der Code für unsere Beispiel Schnittstelle.
VB.NET-Quellcode
soweit so gut.
Um nun diese Schnittstelle sichtbar zu machen müssen wir diese einmal kompilieren.
Nach dem kompilieren fügen wir unserer Host-Anwendung einen Verweis zum Interface hinzu.
Dies geht am Einfachsten im Menü Projekt -> Verweis hinzufügen
Dort suchen Sie die Interface Dll - diese befindet sich im Interface Projekt Ordner unter Release
Jetzt zum Client.
Der Client ist ebenfalls eine Dll.
Also - wieder dem Projekt ein neues Projekt hinzufügen - und wieder eine Klassenbibliothek.
Der Client muss natürlich auch etwas vom Interface wissen.
Setzen Sie auch hier einen Verweis auf die Interface dll.
Nun zum Code des Client (PlugIn)
Normalerweise sollte, sobald sie
eingegeben haben, die IDE alle öffentlichen Member - aus dem Interface - selbstständig eintragen.
geschieht dies nicht, macht das auch nichts. Dann machen wir es eben von Hand.
VB.NET-Quellcode
- 'eine einfache plugin dll
- Public Class myClient
- Implements [Interface].myInterface
- Public Function Addieren(ByVal zahl1 As Integer, ByVal zahl2 As Integer) As Integer Implements [Interface].myInterface.Addieren
- Return zahl1 + zahl2
- End Function
- Public ReadOnly Property Datum() As Date Implements [Interface].myInterface.Datum
- Get
- Return Now
- End Get
- End Property
- End Class
Was jetzt noch fehlt ist der Code unserer Host Anwendung.
Diese besteht aus der Form und einer Klasse zum laden der Dll's
Hier erstmal der Code für die Form
VB.NET-Quellcode
- Imports System.IO
- Public Class Form1
- Private myplugin As [Interface].myInterface
- Private WithEvents t As New Timer
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- For i As Integer = 1 To 100
- Me.ListBox1.Items.Add(i.ToString)
- Me.ListBox2.Items.Add(i.ToString)
- Next
- 'alle plugins laden - in unserem fall ja nur eines
- For Each plugin As String In Directory.GetFiles(My.Application.Info.DirectoryPath, "*.dll")
- myplugin = PlugInConnector.LoadPlugIn(plugin)
- 'lass uns hier mal die schleife beenden.
- 'da sich unsere client dll im selben ordner wie die interface dll befindet, kann es dazu kommen, dass das interface
- 'zuletzt untersucht wird. dies würde dann unser gültiges plugin überschreiben
- If myplugin IsNot Nothing Then Exit For
- Next
- If myplugin Is Nothing Then
- MessageBox.Show("Kein gültiges PlugIn gefunden !")
- Me.Close()
- End If
- 'noch ein paar texte erstellen
- Me.Label1.Text = ""
- Me.Label2.Text = "+"
- Me.Label3.Text = "= ?"
- Me.Button1.Text = "Addieren"
- 'jeweils das erste item jeder listbox aktiviren
- Me.ListBox1.SelectedIndex = 0
- Me.ListBox2.SelectedIndex = 0
- 'jetzt noch den timer starten
- t.Interval = 1000
- t.Start()
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Me.Label3.Text = " = " & myplugin.Addieren(CInt(Me.ListBox1.SelectedItem), CInt(Me.ListBox2.SelectedItem))
- End Sub
- Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles t.Tick
- Me.Label1.Text = myplugin.Datum.ToString
- End Sub
- End Class
So nun zum interessanten Teil der Host-Anwendung.
Fügen sie zu Ihrem Projekt eine neue Klasse hinzu und nennen Sie diese
PlugInConnector.vb
Zu dieser Klasse gehört folgender Code.
VB.NET-Quellcode
- Public Class PlugInConnector
- Public Shared Function LoadPlugIn(ByVal strFile As String) As [Interface].myInterface
- Dim vPlugIn As [Interface].myInterface
- Dim a As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(strFile)
- Dim types() As Type = a.GetTypes
- For Each pType As Type In types
- 'hier wird versucht die dll zu laden.
- 'dies funktioniert nur, wenn die dll auch das selbe interface implementiert
- 'wie der host vorgiebt
- Try
- vPlugIn = CType(a.CreateInstance(pType.FullName), [Interface].myInterface)
- 'dll ist ein gültiges plugin
- Return vPlugIn
- Catch ex As Exception
- End Try
- Next
- 'keine gültige dll gefunden
- Return Nothing
- End Function
- End Class
Ich hoffe, dass ich diesen ausreichend Kommentiert habe, sodass keine Fragen dazu auftreten sollten.
Hinweis1:
Sie sollten sich einen Ordner anlegen, indem sie alle PlugIn Dll's sammeln.
In unserem Beispiel ist das der Anwendungsordner.
Bei dieser Art von Anwendung, kann man den Debugger nur sinnvoll nutzen, wenn man nach jeder Codeänderung im
Client (PlugIn) diesen neu kompilieren lässt.
Standardmäßig wird die erzeugte Dll dann im eigenen Projekt im Debug oder Release Ordner abgelegt.
Dies bedeutet weiterhin, dass wir dann jedesmal die kompilierte Dll in unseren PlugIn Ordner kopieren müssen.
Um dies zu vermeiden tragen wir am besten unseren PlugIn Ordner als Ausgabeort in den Projekteigenschaften ein.
Hinweis2:
Ich würde gerne ein paar Screenshots hinzufügen, jedoch kann ich im moment nicht auf meine Homepage zugreifen,
das das Hotel hier diese Art der Verbindung nicht erlaubt.
Deshalb bitte geduld bis nächste Woche, da bin ich dann wieder daheim.
Nun viel Spass beim PlugIn entwickeln
Gruss
mikeb69