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:
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