8.1.6.NET Remoting.Net ( dotnet ) : von Microsoft eingeführte Plattform für verteilte Anwendungen, virtuelle Maschine für die verteilte Ausführung von Programmen in unterschiedlichen 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.asp http://msdn.microsoft.com/library/en-us/dndotnet/html/introremoting.asp http://www.ingorammer.com/remotingfaq http://www.inf.fu-berlin.de/~lohr/slides/dotnetrem.ppt 1
8.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 memory = ""; public string echo(string s) { return memory += s; } } 2
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 dann durchgefü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 3
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! 4
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 5
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 (interface) für fernaufrufbare Objekte ist üblich, aber nicht obligatorisch. 6
Fernerzeugung eines öffentlichen Objekts (SAO): Erzeugung wird lokal vorbereitet, aber erst dann durchgefü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) 7
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. 8
Fernerzeugung eines privaten Objekts (CAO): Server: Objekt wird auf anderem Rechner erzeugt, und der Erzeuger erhält einen Fernverweis darauf 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); 9
Programmbeispiele mit Anleitung zum Übersetzen und Konfigurieren: http://www.inf.fu-berlin.de/~lohr/slides/dotnetrem.ppt (Anhang) 10
8.1.6.2 Separate Konfiguration Herausziehen der Argumente aus der Erzeugungsoperation und stattdessen Übergabe an eine Konfigurierungs-Operation ermöglicht Fernerzeugung 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 11
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 ) 12
8.1.6.3 Parametermechanismen Parameterübergabe in C#: op(int n) Wertparameter (call-by-value) Bei Fernaufrufen: call-by-value op(ref int n) op(out int n) Variablenparameter (call-by-reference) Bei Fernaufrufen: call-by-value-result! Variablenparameter, evtl. nicht belegt Bei Fernaufrufen: call-by-result!... bei einfachen Typen. Bei Verweistypen zusätzlich... 13
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 (8.1.5 )! 14