| |
VB.NET - Ein- und UmsteigerRe: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 15:04 |
| Klasse ! Vielen lieben Dank! Werd mir das gleich mal anschauen...
Und für die kompetente Hilfe, werd ich mir gleich wieder die neue vbArchiv DVD holen, wenn denn demnächst mal wieder ne neue erscheint ? Weiß das eigentlich jemand, wann wieder eine neue kommt ?
Und zu deiner Frage: Nein, das wurde im anderen Forum leider nicht behandelt. Dort bin ich aber auch nicht aktiv und es kann sein, dass ich es überlesen habe. Bin auf das Tutorial nur durch Onkel Google gestoßen. Auf vbarchiv findet man bei google leider keine tutorials über plugins...
LG,
Michael | |
Plugin System in VB.NET | | | Autor: xater | Datum: 03.03.12 19:22 |
| Hallo zusammen,
meine Frage beruht auf folgendem Tutorial:
http://www.vb-paradise.de/allgemeines/tipps-tricks-und-tutorials/allgemein/8747-wie-erstelle-ich-ein-plugin-system-unter-vb-net-framework-2/
Wie kann ich denn über oben erwähntes Tutorial ein Array als Return Parameter meiner Funktion im Plugin zurück geben ? Leider bekomme ich das nicht so wirlich hin =/ Vielleicht kann mir ja einer auf die Sprünge helfen ?
LG,
Michael | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 10:34 |
| Hallo Dave,
vielen Dank für deine Antwort ! So hab ich es auch ähnlich gemacht:
Interface
'Imports System.Reflection.Emit
'hier müssen alle öffentlichen members aufgeführt werden, welche die
' schnittstelle transportieren soll.
Public Interface MyInterface
'z.b. funktion
Function Addieren() As String
'z.b. property
ReadOnly Property Datum() As Date
'Sub Menuitem()
Function Menuitem() As Array
End Interface Client
'eine einfache plugin dll
Public Class myClient
Implements [interface].MyInterface
Public Function Addieren() As String Implements _
[interface].MyInterface.Addieren
Return "hallo"
End Function
Public ReadOnly Property Datum() As Date Implements _
[Interface].myInterface.Datum
Get
Return Now
End Get
End Property
Public Function Menuitem() As Array Implements _
[interface].MyInterface.Menuitem
Return New Integer() {1, 2, 3}
End Function
End Class Auszug der Form1:
Private Sub Button1_Click_1(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click
Dim returnarray As String
Dim MenItem As ToolStripMenuItem = CType(start.MenuStrip1.Items.Add( _
"Plugins"), ToolStripMenuItem)
returnarray = myplugin.Menuitem()
MenItem.DropDownItems.Add(returnarray(0))
End Sub Sobald ich nun auf den Button drücke, bekomme ich auf der Form in der Zeile:
returnarray = myplugin.Menuitem() folgenden Fehler:
[u]Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
Vielen dank schon mal im Voraus für eine Antwort =) LG,
Michael
Beitrag wurde zuletzt am 04.03.12 um 10:36:02 editiert. | |
Re: Plugin System in VB.NET | | | Autor: Manfred X | Datum: 04.03.12 10:52 |
| Dein MenuItem gibt ein System.Array zurück,
dessen Element-Datentyp nicht näher definiert ist.
(Deklariere - falls möglich - explizit einen Typ).
Der Client liefert ein Integer-Array, das aber in
Form1 einer StringVariable zugewiesen wird ????
Wo wird die Instanz von "MyPlugin" in Form1 erstellt?
Ich vermute, die gibt es nicht.
Beitrag wurde zuletzt am 04.03.12 um 10:52:46 editiert. | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 11:10 |
| Hallo Manfred,
das mit dem Integer war eigentlich nur wegen dem Testen. Später sollen dort Strings verschoben werden und keine Integer. Was die Form angeht, so wir eine Instanz ganz am Anfang erstellt mit:
[u]Private myplugin As [Interface].myInterface
Wie definiere ich denn so einen Typ wie du vorgeschlagen hast ? Ich habe schon alle möglichen Deklarationen versucht, bekomme es aber einfach nicht hin.. =/ LG,
Michael | |
Re: Plugin System in VB.NET | | | Autor: Manfred X | Datum: 04.03.12 11:29 |
| Hallo!
Damit erstellst Du nur eine Zugriffsvariable, aber keine Instanz
des Plugin-Objekts.
Führst Du die Funktion LoadPlugin der "PluginConnector"-Klasse aus?
Vorsicht! Auf der von Dir verlinkten Seite enthält die
Funktion einen unverarbeiteten Try-Catch-Block, d.h. man
bemerkt nicht, wenn das Erstellen einer Objekt-Instanz aus der Assembly
schief geht.
Du erhälst lediglich Nothing zurück - dieser Fall scheint bei
Dir vorzuliegen. Fange mal die Ausnahme auf und ermittle
die Fehlermeldung.
Wie man ein Array mit explizitem Element-Datentyp deklariert:
siehe Beitrag von DaveS.
Beitrag wurde zuletzt am 04.03.12 um 11:36:40 editiert. | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 11:36 |
| Hallo,
ja die Funktion wird in der Form aufgerufen:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
'alle plugins laden - in unserem fall ja nur eines
For Each plugin As String In Directory.GetFiles( _
My.Application.Info.DirectoryPath, "PlugIns/*.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
End Sub Auf Nothing wird dabei ja auch überprüft und eine MsgBox ausgegeben. Somit werden die DLL's auch geladen. | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 12:10 |
| Sorry aber ich bekomm es einfach nicht hin.. =( Kann mir denn nicht irgend jemand bei der Form mit dem returnparameter helfen ? Sicherlich ist es nur was einfaches, aber ich steh so auf dem Schlauch, dass ich einfach nicht auf die Lösung komm... LG,
Michael | |
Re: Plugin System in VB.NET | | | Autor: Manfred X | Datum: 04.03.12 12:26 |
| Das sollte aber funktionieren.
Mein Interface:
Public Interface myInterface
ReadOnly Property MenuItemTexte As String()
End Interface Mein Client:
Public Class myClient
Implements Plugin_Test.myInterface
Public ReadOnly Property MenuItemTexte As String() _
Implements Plugin_Test.myInterface.MenuItemTexte
Get
Dim Menuitems() As String = {"Item1", "Item2", "Item3"}
Return Menuitems
End Get
End Property
End Class Mein Host:
myplugin = PlugInConnector.LoadPlugIn(plug)
Dim mit() As String = myplugin.MenuItemTexte Leg die DLLs in verschiedene Verzeichnisse. Es wäre möglich,
dass Du das Interface statt des Clienten erwischt.
Beitrag wurde zuletzt am 04.03.12 um 12:54:35 editiert. | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 13:08 |
| Ich verstehe nicht was bei deinem Host die erste Zeile bringen soll ?! | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 13:20 |
| aber warum gibst du denn das wort plug der funktion weiter ? weil der kann damit ja überhaupt nichts anfangen ?! sorry wenn ich so hinterfrag, aber ich will ja was lernen ;) | |
Re: Plugin System in VB.NET | | | Autor: Manfred X | Datum: 04.03.12 13:27 |
| Hallo!
Die Funktion "LoadPlugin" will als Parameter den Pfad/Namen des Files
haben, das geladen werden soll - also die Client.DLL
"Plug" ist der Name einer String-Variable, die diese Angabe enthält.
Bei mir ist sie so gefüllt ...
Dim plug As String = _
"F:\VBArchive\Demos\Plugin_Test\Plugin_Client\bin\Debug\Plugin_Client.dll" | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 14:37 |
| Hallo Manfred,
vielen lieben Dank für die kompetente Hilfe ! Jetzt klappt auch alles... =) Aber jetzt habe ich doch noch so eine Frage am Rand, falls du mir die beantworten kannst.
Weißt du wie ich vom Plugin aus, auf eine Funktion in meiner Hauptanwendung zugreifen kann ? Wenn du mir da noch helfen würdest, wär ich dir total dankbar =)
LG,
Michael | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 16:26 |
| Also das habe ich auch gefunden. Allerdings finde ich, dass es wesentlich besser erklärte Tutorials gibt, als das oben erwähnte. Vor allem, da dort viele Codefragmente fehlen. ;) LG,
Michael | |
Re: Plugin System in VB.NET | | | Autor: xater | Datum: 04.03.12 17:21 |
| Ja, is schon richtig ! Das mit der iHost werd ich mir auf jeden Fall im Laufe des Abends oder morgen gleich mal ansehen. Sobald ich das durchgearbeitet habe, meld ich mich hier nochmal zurück. Danke aber nochmals für die viele Hilfe ! =) LG,
Michael | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|