Hallo,
habe die Problematik bis jetzt so gelöst:
Der Client erstellt ein Remoteobject namens "server" und ruft eine Methode zur Initialisierung der Datenmember des Servers auf. Dabei übergebe ich ein Instanz "instanz" der Klasse(Der Clientanwenung), die die Methode beinhaltet. Bei der Initialisierung auf Serverebene wird ein delegate erzeugt und der Funktion des Objekts zugewiesen. Danach wird je nach bedarf die Funktion des Clients aufgerufen, indem der Server den namen der delegate instanz verwendet.
Ich soll allerdings die Methode vom CLient im Server aufrufen, ohne den Methodennamen zu wissen. Nach diesem Modell muss der Name ja bekannt sein, da ich dem delegate die Methode (instanz.funktionsnamen) zuweisen muss.
Also wollte ich das delegate im Client erstellen, der methode zuweisen und dann die delegate instanz als parameter an die Initialisierungsmethode des Servers übergeben. Der Server kennt dann den Namen der Methode nicht, ruft diese allerdings per delegate auf.
Obwohl es keine Fehlermeldung gibt beim kompelieren, scheint dies nicht zu funktionieren. Weiß jemand warum das sein könnte? Das delegate ist einer DLL hinterlegt, die in Server/Client eingbettet sind.
Frage am Rande.
Was willst du genau damit erreichen?
Eigentlich sollte der Server nie den Client ansprechen.
Der Server sollte im Idealfall die gesamte Verarbeitung haben.
Der Client sollte dann nur die Daten fertig bekommen und nur noch präsentieren(anzeigen).
Ich würde bei deiner aktuellen Beschreibung von einer schlechten Architektur sprechen.
Den so wie du das ganze schilderst, klingt das auch nicht wirklich nach Client/Server Architektur.
Ein paar mehr Details zu dem fertigen Prozess wären hilfreich um dir eine bessere Lösung anzuzeigen.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Die DLL, die der Server und der Client verwendet, verwendet nicht die gleichen Resourcen.
Selbst wenn du eine Klasse erstellst und in dieser ein Event zugewiesen wird, die Klasse dann irgendwie an den Server geschickt wird, kann der Server das Event nie auf dem Clienten auslösen.
Schau dir mal WCF an. Hier ist der Aufruf vom Server zum Clienten möglich, aber nur durch ein Interface welches die benötigten Callbacks definiert.
Ist leider so in der in der Aufgabenstellung vorgegeben. Ich denke es geht darum, dass die Methode (entspricht eienr Funktionsgleichung) im Client geändert werden kann, also für viele Gleichungen erfolgen kann, ohne im Server etwas ändern zu müssen.
Also ganz vereinfacht, soll ein Server eine Methode im Client via delegate aufrufen, deren Namen er nicht kennt. Mit der Übergabe des zugewiesenen delegates an den Server hat es leider nicht funktioniert.
Generell erfolgt die Benutzereingabe im Client, dieser schickt die Daten an den Server, der die Brecehnung auch mithilfe einer Methode im Client durchführt. Danach sendet er die Daten an den Client zurück, wo die Auswertung erfolgt.
Ich kann mir im praktischen Umfeld keine Situation vorstellen die so etwasbenötigt.
Aber im Interface kannst Du auch ein Delegate definieren. Das geht evtl.
Im Interface darf man doch keine delegates definieren, doer habe ich das falsch verstanden?
Versteh ich das richtig, dass Du dem Server eine komplette Methode mit Ausführungsinhalt übergeben willst, alá Script?
Sprich im Client definierst Du eine Methode und auf dem Server soll die ausgeführt werden?
Sowas funktioniert (Gott sei dank) nicht, nicht mal als Delegate.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich zitiere mal die Aufgabenstellung, vielleicht versteh ich da ja etwas falsch:
"Definieren Sie die Funktionen y'¢ in der Client-Assembly. Nutzen Sie das Delegate zum Aufruf der Funktionen vom Server"
Und das ist nicht möglich?
Die Ausdrucksweise der Frage lässt viel Spielraum.
Du kannst sagen:
"Server, Du kennst Methode "Execute". Führ sie mit folgenden Parametern aus aus."
So funktioniert jede API, egal ob SOAP, REST und wie sie alle heißen.
Aber Du kannst nicht sagen:
"Hey Server, führ folgendes aus: public void Method.....".
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Also in dem Zusammenhang fiel die Aussage, dass der Server eine für ihn unbekante Methode (Namen) aufruft. Dadurch wird es doch konkreter oder?
Wenn es prinzipiell eine bekannte Methode ist, aber nur der Name übergeben werden soll; das geht wie gesagt (Invoke).
Aber eine komplette Methodensignatur mit Body und Co: das geht nicht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Letztendlich soll der Server die Methode im Client aufrufen, ohne dass der Methodennamen explizit im Server deklariert werden muss. Bis jetzt habe ich es nur so gelöst, dass ich das Object der Klasse, die diese Methode definiert an den Server übergebe. Und dort ein delegate erstellt wird, dass mit der Methode des Objects zugeweisen wird. Da muss ich ja allerdings den Namen der Methode wissen (delegatetype name = new delegatetyp(object.methodenname)).
Ich verstehe nicht wie ich den Methodennamen übergeben soll...
Hi ich denke Server und Client sind, haben hier ein wenig für Verwirrung gesorgt.
Wenn ich es richtig verstanden habe erzeugt der Client ein RemoteObjekt namens Server.
Der Server kann, natürlich ein Event (Delegate) bereitstellen, was der Client Abonniert.
Schau dir mal Remote Objects Part 1 an.
Ansonsten mal nach Remote Objekts und Events googlen.
Sollte man mal gelesen haben:
Ja genau, ich erzeuge ein RemoteObject , sorry dass es zur Verwirrung kam, ich kenne mich mit dem Thema nicht so gut aus. Ich werd mir das mal anschauen. Das delegate im Client zu definieren und an die Serveranwendung zu schicken hat nciht funktioniert.
Der Server soll auch auch den delegate (Methoden Zeiger) bereitstellen, den der Client dann abonniert. Ein Zeiger vom Server auf die Methode des Clients. Dann kann der Server auch die Methode aufrufen.
Sollte man mal gelesen haben:
Verstehe ich das nun richtig:
Ich definiere ein Event im Serverprozess mit passendem delegate (gleicher typ wie die Methode die im Client definiert ist). Ich erzeuge ein remote Object der Serverklasse im Client. Dann weiße ich der Methode im Client das Event zu. Und schließlich wird das Event an passender stelle im Serverprozess aufgerufen.
Danke schonmal für eure Hilfe!
Grundlegend schon.
Nur das Evenst ein spezial Fall eines Delegate ist. Also alle Events sind Delegates, aber nicht alle Delegates Events. Was passen muss ist die Signatur der Methode. Das sind aber Grunlagen, die man sich ergooglen kann.
MFG
Björn
Sollte man mal gelesen haben:
Damit sollte dann wirklich alles gesagt sein. Der Thread lang genug und hat sich oft genug im Kreis gedreht.