1 7.1.6.NET Remoting.Net („dotnet“) :von Microsoft eingeführte Plattform für verteilte...

Preview:

Citation preview

1

7.1.6 .NET Remoting

.Net („dotnet“) : von Microsoft eingeführte Plattformfür verteilte Anwendungen,

virtuelle Maschine für die verteilteAusführung von Programmen inunterschiedlichen Sprachen

C# („Csharp“, „Cis“) : Referenzsprache für .NET,

Microsoft‘s Antwort auf Java

.NET Remoting : Fernaufrufe auf der .NET-Plattform

http://msdn.microsoft.com/library/en-us/dndotnet/html/hawkremoting.asphttp://msdn.microsoft.com/library/en-us/dndotnet/html/introremoting.asphttp://www.ingorammer.com/remotingFAQ http://www.inf.fu-berlin.de/~lohr/slides/dotnetrem.ppt

vs7.1.6 2

7.1.6.1 Grundzüge der Fernaufruf-Programmierung in C#

Klasse eines fernaufrufbaren Objekts muss erben von

System.MarshalByRefObject

z.B. using System;using System.Runtime.Remoting;

class Server : MarshalByRefObject{ private string memo = "";

public string echo(string s){ return memo += s;}

}

vs7.1.6 3

Objekterzeugung und –bekanntmachung in 3 Varianten:

Bekanntmachung eines öffentlichen Objekts: Objekt wird lokal erzeugt und dann „veröffentlicht“

Fernerzeugung eines öffentlichen Objekts (SAO):Erzeugung wird lokal vorbereitet, aber erst danndurchgeführt, wenn der erste Klient Interesse zeigt

Fernerzeugung eines privaten Objekts (CAO):Objekt wird auf anderem Rechner erzeugt,und der Erzeuger erhält einen Fernverweis darauf

vs7.1.6 4

Bekanntmachung eines öffentlichen Objekts mit Operation der Klasse System.Runtime.Remoting.RemotingServices :

using System;using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Tcp;

TcpChannel channel = new TcpServerChannel(4711);ChannelServices.RegisterChannel(channel);

Server server = new Server();

RemotingServices.Marshal(server, "Service");

bewirkt Registrierung bei eingebautem Namensdienst !

vs7.1.6 5

Nachdem dies auf dem Rechner obelix ausgeführt wurde,erhalten Klienten einen Fernverweis/Vertreterobjekt wie folgt:

using System.Runtime.Remoting.Activation;

Server s = (Server)Activator.GetObject( typeof(Server), "tcp://obelix:4711/Service");

Verweis auf Vertreter eines anonymen Typs, verträglich mit Server

vs7.1.6 6

Beachte:

Keine explizite Stub-Erzeugung

Stub Generator ist unsichtbar, erzeugt Stub Code bei Bedarf aus den Metadaten (Schnittstellenbeschreibungen u.a.) der beteiligten Klassen und Schnittstellen.

Explizite Definition einer Schnittstelle für fernaufrufbareObjekte ist üblich, aber nicht obligatorisch.

vs7.1.6 7

Fernerzeugung eines öffentlichen Objekts (SAO):Erzeugung wird lokal vorbereitet, aber erst danndurchgeführt, wenn der erste Klient Interesse zeigt

ChannelServices.RegisterChannel( new TcpServerChannel(4711)); RemotingConfiguration.RegisterWellKnownServiceType( typeof(Server), „Service", WellKnownObjectMode.Singleton);

d.h. ein Objekt mit Zustand(im Gegensatz zu SingleCall)

vs7.1.6 8

Klient arbeitet wie bei :

Server s = (Server)Activator.GetObject( typeof(Server),"tcp://obelix:4711/Service");

Achtung:

Hier taucht weder beim Klienten noch beim Anbieter ein new auf. Das Objekt wird mit einem argumentlosen Konstruktor erzeugt. Es gibt also keine parametrisierte Initialisierung.

vs7.1.6 9

Fernerzeugung eines privaten Objekts (CAO):Objekt wird auf anderem Rechner erzeugt,und der Erzeuger erhält einen Fernverweis darauf

Server:

RemotingConfiguration.RegisterActivatedServiceType(typeof(Server));

Klient – hier beispielhaft für Konstruktor mit 1 Argument:

object[] attr = {new UrlAttribute("tcp://host:4711")};object[] args = {"some constructor argument"};Server s = (Server)Activator.CreateInstance(

typeof(Server), args, attr);

vs7.1.6 10

Herausziehen der Argumente aus der Erzeugungsoperation undstattdessen Übergabe an eine Konfigurierungs-Operation ermöglichtFernerzeugung mittels new (nur parameterlos!) für und :

RemotingConfiguration.RegisterWellKnownClientType(

typeof(Server),"tcp://host:4711/Service");

Server s = new Server(); // no Activator.GetObject

RemotingConfiguration.RegisterActivatedClientType(

typeof(Server),"tcp://host:4712/Service");

Server s = new Server(); // no Activator.CreateInstance

vs7.1.6 11

Programmbeispiele

mit Anleitung zum Übersetzen und Konfigurieren:

http://www.inf.fu-berlin.de/~lohr/slides/dotnetrem.ppt (Anhang)

vs7.1.6 12

7.1.6.2 Parametermechanismen

Parameterübergabe in C#:

op(int n) Wertparameter (call-by-value)

op(ref int n) Variablenparameter (call-by-reference)

op(out int n) Variablenparameter, evtl. nicht belegt

... bei einfachen Typen. Bei Verweistypen zusätzlich .....

vs7.1.6 13

7.1.6.2 Parametermechanismen

Parameterübergabe in C#:

op(int n) Wertparameter (call-by-value)Bei Fernaufrufen: call-by-value

op(ref int n) Variablenparameter (call-by-reference)Bei Fernaufrufen: call-by-value-result !

op(out int n) Variablenparameter, evtl. nicht belegtBei Fernaufrufen: call-by-result !

... bei einfachen Typen. Bei Verweistypen zusätzlich .....

vs7.1.6 14

Bei Verweistypen zusätzlich beachten (bei Argumenten und Ergebnissen!):

Wenn Objekt fernaufrufbar (MarshalByRefObject):Fernverweis wird übergeben;

sonst, wenn Objekt serialisierbar ( [Serializable] ):Objektkopie wird übergeben;

sonst:Ausnahmemeldung

Probleme wie bei Java RMI (7.1.5)!

vs7.1.6 15

7.1.6.3 Konfigurationsdateien

Auslagerung der netzspezifischen Daten wie

Rechnernamen, Portnummern, Protokollnamen, …

aus dem Programmtext in Konfigurationsdateien (XML)

erlaubt deren Änderung ohne Neuübersetzung,

flexibilisiert die Installation,

verbessert die Verteilungsabstraktion.

(Mehr dazu in http://www.inf.fu-berlin.de/~lohr/slides/dotnetrem.ppt )

Recommended