Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Objektinstanzen per Remoting "verschicken"
JDizzle
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

Objektinstanzen per Remoting "verschicken"

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

Zitat
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.
Zitat
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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo zusammen,
Zitat
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!?
Zitat
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
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

.NET Remoting

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
JDizzle
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

beantworten | zitieren | melden

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");
private Nachricht | Beiträge des Benutzers
JDizzle
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

beantworten | zitieren | melden

Das is genau das was ich gesucht hab. Danke
private Nachricht | Beiträge des Benutzers