Entwickler-Ecke
Verteilte Systeme - WinForms App als Remoting Server - Wie Ausgabe auf dem Form?
Ares - Do 15.01.09 17:34
Titel: WinForms App als Remoting Server - Wie Ausgabe auf dem Form?
Hallo!
Ich mache gerade meine ersten Schritt mit .NET Remoting und versuche mich an einer ersten Testanwendung. Das Projekt besteht aus einem Server und einem Client, beides Windows Forms Anwendungen.
Im Client wird ein Objekt erzeugt, dass im Server instantiiert ist und ruft Methoden dieses Objektes auf. Mein Ziel ist es nun, dass durch diese Methoden etwas auf dem Form des Servers geändert wird (z.B. Text in TextBox ausgeben).
Der Server sieht so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| namespace Interfaces { public interface IMyService { string func1(); string func2(); } }
namespace Server { public class MyService: MarshalByRefObject, IMyService { private string randValue;
public MyService() { Random rand = new Random(); randValue = rand.Next(9999).ToString(); } public string func1() { return "Im Server " + randValue + " wurde Funktion 1 aufgerufen\r\n"; }
public string func2() { MachWasMitServerForm(); } } }
namespace Server { static class ServerApp { [STAThread] static void Main() { RemotingConfiguration.Configure("Server.exe.config", false);
Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new ServerForm()); } } } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| namespace Client { public partial class ClientForm : Form { private IMyService myService; public ClientForm() { InitializeComponent();
myService = Activator.GetObject(typeof(IMyService), "tcp://localhost:12345/MyServiceUri") as IMyService; }
private void button1_Click(object sender, EventArgs e) { Application.Exit(); }
private void button2_Click(object sender, EventArgs e) { textBox1.Text += myService.func1(); }
private void button3_Click(object sender, EventArgs e) { myService.func2(); } } } |
Das Problem ist nun die Stelle MachWasMitServerForm(); weil das Objekt das Server-Form ja gar nicht kennt. Das Objekt wird zwar im Server instanziiert aber von der Logik her befindet es sich im Client und dort ist ja nichts weiter über den Server bekannt.
Kann MyService also überhaupt irgendwas im Server machen? Kann MyService mit irgendwelchen Teilen des Serverprogramms in Kontakt treten um dort z.B. Daten abzufragen oder eben etwas in einem Form auszugeben?
Eigentlich soll ein Objekt ja nur auf solche Objekte zugreifen die es selbst direkt oder indirekt erstellt hat. Insofern ist MyService ja gänzlich gelöst vom Server und kann nicht auf diesen zugreifen. Oder verstehe ich das falsch?
Ich habe zwar zahlreiche Beispiele zum Thema Remoting gefunden aber die arbeiten alle mit einer Konsolenanwendung als Server. Der Server kann dort über Console... also ganz einfach etwas ausgeben. Aber wie soll das bei einer WinForms Anwendung funktionieren?
Besten Dank
Ares
Kha - Do 15.01.09 20:31
Zum Problem kann ich nichts sagen, nur ein kurzer Hinweis, falls du nicht an 2.0 gebunden bist: Mit 3.0 hat WCF .NET-Remoting abgelöst.
Ares - Fr 16.01.09 09:21
Kha hat folgendes geschrieben : |
Zum Problem kann ich nichts sagen, nur ein kurzer Hinweis, falls du nicht an 2.0 gebunden bist: Mit 3.0 hat WCF .NET-Remoting abgelöst. |
Bevor ich mich an Remoting versucht habe, habe ich mich zunächst mit WCF beschäftigt. Soweit ich weiß kann die WCF derzeit nur unter XP, Vista und Windows Server verwendet werden, das Programm sollte aber möglichst allgemein einsetzbar sein.
Wenn ich das richtig verstanden habe lassen sich mit der WCF nur zustandslose Services erstellen. Ich möchte aber gerne erreichen, dass ein Client permanent Daten von einem Server abfragen und an diesen senden kann. Der Zustand des Servers soll also durch den Client verändert werden können. Ist die WCF dafür geeignet? Bzw. zu meiner ursprünglichen Frage: Ist Remoting hierfür geeignet?
Kha - Mo 19.01.09 18:34
Zumindest bei WCF habe ich gerade gesehen, dass es auch einen ServiceHost-Konstruktor gibt, der ein Objekt des Contract-Interfaces entgegennimmt; damit sollte es also funktionieren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!