Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Do 15.01.09 17:34 
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:
ausblenden volle Höhe 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:
// Interface des Service
namespace Interfaces {
    public interface IMyService {
        string func1();
        string func2();
    }
}
// ------

// Implementierung des Service
namespace Server {
    public class MyService: MarshalByRefObject, IMyService {
        private string randValue;

        public MyService() {
            Random rand = new Random();
            randValue = rand.Next(9999).ToString();
        }        
        
        public string func1() {
            // Einfache Textrückgabe an den Client damit diese dort ausgegeben werden kann 
            return "Im Server " + randValue + " wurde Funktion 1 aufgerufen\r\n";
        }

        public string func2() {
            // Hier soll etwas auf dem Serverform ausgeben werden
            MachWasMitServerForm();
        }
    }
}
// -----


// Das Eigentlich Serverprogramm
namespace Server {
    static class ServerApp {
        [STAThread]
        static void Main() {
            RemotingConfiguration.Configure("Server.exe.config"false);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new ServerForm());
        }
    }
}




ausblenden 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:
// Das Client-Form
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Fr 16.01.09 09:21 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

_________________
>λ=