OK, du sagtest ich solle einen Delegaten ins Interface setzen. MMhh, das geht so nicht, denn ich wollte keine Kommunikation zwischen UserDLL und dem schon implementierten Interface, sondern eine Kommun. von UserDLL zum Hauptprogramm.
OK, der Reihe nach. Wenn die Plugins geladen werden, wird in der UserDLL, in der Klasse die IPlugIn implementiert die Property Prop angesprochen. Dort hat die UserDLL ein paar Einstellungen vorgenommen, die nun das Hauptprogramm abfragt.
Dann werden alle Plugins in ne Collection geladen und Menü keiert.
Irgendwann wird ein Menu-Click ausgelöst, Dann (siehe Code Hauptprogramm). Es wird eine Instanz der DLL erzeugt und es wird die Methode GetMessage in der UserDLL in der Klasse, die IPlugIn implementiert, angesprochen. Diese Methode empfängt nun als Beispiel die Message "MyItemClick", was so viel bedeutet wie, pass auf liebe DLL man hat dich im menü angeglickt.
Schau dir nun den Code in UserDLL an. Die DLL fragt in GetMesage als Beispiel ab, was für eine Message angekommen ist und reagiert mit einer Instanz einer eigenen Form der Rückmeldung, dass diese angezeigt werden soll und welche es denn ist:
Dim frm As New Form1
GetMessage.Message = _
CirculiSDK.PC.Circuli.IPlugIn.ReturnMessages.ShowMyDialogAsMdi
GetMessage.MyForm = frm Wie du im Hauptprogramm sehen kannst, wertet es die Rückgabe aus und je nach Rückgabe führt es halt was aus. Wie du aber bis jetzt immer gelesen hast startet die Kommunikation vom Hauptprogramm aus. Es könnte aber sein, dass die DLL irgendwann den Reiz verspürt selbnst die Kommunikation aufzunehmen und genau das klemmt es. Ich kann keinen Delegaten ins Interface setzen, denn weder das Interface noch die UserDLL kennen die Existenz des Hauptprogramms. Somit haben diese auch keine Möglichkeit auf das Hauptprogramm so zu zu gehen. Also dachte ich erst an Socket,TCPListener etc. Probleme hatte ich schon geschildert. Ausserdem ist das mit der Rückgabe nicht so effizient wie mit meiner GetMessage.
Also musste was anderes her. Und jetzt schau dir die andere Auswertung in GetMessage an:
If Message = CirculiSDK.PC.Circuli.IPlugIn.Messages.MyMenuItemClick Then
Dim param() As Object = _
{CirculiSDK.PC.Circuli.IPlugIn.ReturnMessages.SetProperties}
SendMessageMethod.DynamicInvoke(param)
End If Die GetMessage bekommt von Hauptprgramm den Delegaten (musst du in dr Parametzerliste ganz nach hinten durch ;)).
Das Teil heisst SendMessage. Der User müsste nun ein Array (param) für die Parameterübergabe erstellen und die Methode dann mit DynamicInvoke auslösen. Da kommen wir der Sache schon näher, aber jetzt kommt das aber.
1. Ich müsste der Prop und der GetMessage den Delegaten immer übergeben und der User müsste manuell in der Prop sich das Ding zwischenspeichern, so dass er auch außerhalb der Klasse von anderen Klassen darauf zugreifen kann. Weil erst dann könnte die UserDLL der jenige sein, der die Kommunikation eröffnet. Die Rückmeldung des Hauptprogramms würde grundsätzlich wieder an GetMessage gehen, was der User ja dann wieder auswerten kann. Mich stört hier die Übergabe
2. Der User hat kein direktes Invoke, sonder er muss erst selber die Param-Liste erstellen, dort die Message platzieren und dann DynamicInvoke asuführen. Schöner wäre einfach eine Methode SendMessage im Interface (somit also auch in der UserDLL), die derjenige aufruft und das Teil mach dann alles selber. Das geht aber schlecht da ein Interface nur den Körper darstellt.
Hier noch den Delegaten aus dem Hauptprogramm.
Delegate Function MyDel(ByVal message As _
CirculiSDK.PC.Circuli.IPlugIn.ReturnMessages) As String
Public Function MyDelFunc(ByVal message As _
CirculiSDK.PC.Circuli.IPlugIn.ReturnMessages) As String
MsgBox(message.ToString)
End Function
Dim MyDelCopy As MyDel
MyDelCopy = AddressOf MyDelFunc Die MyDelCopy ist das was an die GetMessage geschickt wird. Aber wie gesagt, mir gefällt das nicht so richtig. Mit würde es erst dann einigermaßen gefallen, wenn ich den Delegaten so übergeben kann, das die UserDLL das Teil nur noch mit:
SendMessage.Invoke(Was für ne Message) aufrufen müsste. Aber meine gestrigen Bemühungen verliefen alle im Sand. Das Teil kennt nach meiner Übergabe nur DynamicInvoke. |