Laden...

Objektinstanzen per Remoting "verschicken"

Erstellt von JDizzle vor 18 Jahren Letzter Beitrag vor 18 Jahren 34.324 Views
J
JDizzle Themenstarter:in
15 Beiträge seit 2005
vor 18 Jahren
Objektinstanzen per Remoting "verschicken"

Hi,

mein Problem ist folgendes: Ich möchte eine Instanz eines Objektes mit einem Client von einem Server abrufen. Ich habe die Klasse aus der das Objekt instanziiert werden soll, in einer DLL Datei und jeweils eine WinForm für Client und Server.

Ich möchte, dass ich auf dem Server eine Instanz dieses Objekts erstelle, dieses mit Werten fülle und dann vom Client auf genau diese Instanz zugreife.

Alle Sachen über Remoting, die ich bis jetzt gefunden hab, waren genauso aufgebaut. Allerdings wurde da immer nur vom Client auf die Klasse zugegriffen, aber nicht auf eine extra Objektinstanz.

Ich hab hier im Forum auch schon ne Menge über Remoting gelesen, aber nichts, was mein Problem löst. Vielleicht bin ich ja auch einfach nur zu blöd, die Sachen zu kapieren. In dem Fall wär ich sehr erfreut, wenn mich jemand direkt mit der Nase draufstoßen würde 😉

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo JDizzle,

in Remoting mit Win32-Anwendung sollte alles stehen, was du brauchst.

Das Objekt ArgsReceiver wird zwar mit new im Client erzeugt, aber das ist nur ein Stellvertreter. Das Original-Objekt liegt im Server.

Aber Achtung: Wenn Objekte vom Client zum Server oder andersherum übertragen werden (Parameter, Rückgabewerte), erfolgt das immer by-value.

herbivore

P
939 Beiträge seit 2003
vor 18 Jahren

herbivore
Aber Achtung: Wenn Objekte vom Client zum Server oder andersherum übertragen werden (Parameter, Rückgabewerte), erfolgt das immer by-value.

Alles, was von System.MarshalByRefObject ableitet, wird by-ref übergeben. Dazu gehören auch alle System.Windows.Forms.Controls.

JDizzle
Alle Sachen über Remoting, die ich bis jetzt gefunden hab, waren genauso aufgebaut. Allerdings wurde da immer nur vom Client auf die Klasse zugegriffen, aber nicht auf eine extra Objektinstanz.

Ja, das ist so. Je nach Konfiguration instantiiert der erste Client-Zugriff ein Objekt der bekannt gemachten/well known Server-Klasse. Die Server-Klasse ist nur eine Factory (wie ein Home-Interface in Java). In deinem Fall muss sie Methoden anbieten, die die remote zu steuernden Windows-Controls zurückliefern.

Gruss
Pulpapex

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen,

Alles, was von System.MarshalByRefObject ableitet, wird by-ref übergeben.

danke für die Richtigstellung. Wenn ich mir den Klassennamen so anschaue, fällt es mir wie Schuppen von den Haaren. Ich hatte im Zusammenhang mit SOAP gelesen, dass die Objekte immer als Value übergeben werden und das dann unreflektiert übernommen, sorry. Aber vielleicht stimmt das ja nicht mal für SOAP und ich bin irgendwie auf der falschen Spur!?

Aus der SDK-Doku:
MarshalByRefObject ist die Basisklasse für Objekte, die über Grenzen von Anwendungsdomänen hinweg durch den Austausch von Meldungen über einen Proxy kommunizieren. Objekte, die nicht von MarshalByRefObject erben, werden implizit als Wert gemarshallt. Wenn eine Remoteanwendung auf ein Objekt verweist, das als Wert gemarshallt wird, wird eine Kopie des Objekts über die Grenze der Anwendungsdomäne hinweg übergeben.

Nach etwas Lektüre lautet mein Warnung: Aber Achtung: Wenn Objekte vom Client zum Server oder andersherum übertragen werden, die nicht von direkt oder indirekt von MarshalByRefObject erben (Parameter, Rückgabewerte), erfolgt das by-value. Sprich entsprechende Objekte, die lokal Referenzsemantik haben, bekommen beim Remoting plötzlich Wertsemantik.

herbivore

P
939 Beiträge seit 2003
vor 18 Jahren

Mir ist noch was eingefallen. So ein ähnliches Thema gab es schon mal.

Das Problem war: wie erhält ein frisch erstelltes Well-Known-Service-Objekt Zugriff auf die schon laufende Server-GUI-Anwendung?

Ich hatte damals vorgeschlagen, dass der Well-Known-Service-Type als Singleton konfiguriert wird und dass sich sowohl Client- als auch Server-Anwendung über dafür vorgesehene Methoden bei diesem registrieren. Also die Server-Anwendung ist quasi auch nur ein Client.

Man kann die Server-Anwendung auch über eine statische Methode verfügbar machen. Finde ich aber unschön.

Gruss
Pulpapex

3.728 Beiträge seit 2005
vor 18 Jahren
.NET Remoting

Hallo,

das folgende Schulungsvideo von Ralf Westphal finde ich für den Einstieg in .NET Remoting super. Es werden die wichtigsten Konzepte anschaulich erklärt und man bleibt nicht mit "gefährlichem Halbwissen" zurück.

http://www.microsoft.com/germany/msdn/nettv/folge1.mspx

Folderder Artikel sollte eventuell verbleibende Fragen klären:

http://www.microsoft.com/germany/msdn/library/net/DasNETRemotingFrameworkEntwicklungVerteilterApplikationenAufBasisDesNETFrameworks.mspx

P.S der Link funktioniert nur, wenn er direkt in Browser eingegeben wird. Sorry, ging nicht anders.

J
JDizzle Themenstarter:in
15 Beiträge seit 2005
vor 18 Jahren

Ok erstmal vielen Dank für eure Antworten. Haben mir als C#-Noob aber nicht wirklich weitergeholfen. Mir ist schon klar, wie ich auf Methoden des Objektes zugreifen kann, aber ich will ja auf Variablenwerte zugreifen.

Ok ich probiers mal beispielhaft zu veranschaulichen.


public class Mensch : MarshalByRefObject 
{
    public string Name;
}

So dann instanziiere ich auf meinem Server ein Objekt vom Typ Mensch und definiere die Variable Name als "Peter".

Wie kann ich dann auf das instanziierte Objekt, wo die Variable schon gefüllt ist, zugreifen. Wenn ich normal ein Objekt fürs Remoting registriere, dann immer nur die Klasse, aber nie eine Instanz.

A
154 Beiträge seit 2005
vor 18 Jahren

Also wenn du auf eine konkrete Instanz einer Klasse zugreifen willst, dann mußt du das als SAO veröffentlichen. (zumindest wenn ich dich richtig verstanden habe)

Hier ein paar Zeilen Code


Mensch peter = new Mensch("Peter");	

RemotingConfiguration.RegisterWellKnownServiceType(
					typeof(Mensch),
					"MyServer.rem",
					WellKnownObjectMode.Singleton);
				
RemotingServices.Marshal(peter,"MyServer.rem");

J
JDizzle Themenstarter:in
15 Beiträge seit 2005
vor 18 Jahren

Das is genau das was ich gesucht hab. Danke 🙂