Mittels IPC ist es möglich, Funktionen und Eigenschaften in lokalen oder entfernten Prozessen aufzurufen, bzw. Daten zw. Prozessen auszutauschen. Folgendes Beispiel registriert ein Objekt vom Typ MyRemoteObject über IPC und zeigt den Zugriff aus einem Prozess heraus.
// einfaches Interface definieren
public interface ISharedAssemblyInterface
{
int Add(int a, int b);
}
// Klasse, die eine Berechnungsfunktion (Add) hat, definieren
public class MyRemoteObject : MarshalByRefObject, ISharedAssemblyInterface
{
public MyRemoteObject()
{
}
public int Add(int a, int b)
{
return a + b;
}
}
- Formularklasse mit 2 Buttons und 1 Label, die Server und Client beinhaltet
- durch Klicken auf Button1 wird das Objekt EINMAL registriert, welches dann von ALLEN weiteren Instanzen über Button2 abgerufen werden kann
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc; // unter "Verweise" im Projekt hinzufügen
public partial class Form1 : Form
{
// Kommunikationsparameter
string sUniqueName = "InstanceControl";
string sUniquePortName = "InstanceControlIPCPort";
string sURLClient = "ipc://";
string sURLService;
public Form1()
{
InitializeComponent();
sURLClient += sUniquePortName + "/" + sUniqueName;
sURLService = sUniqueName;
}
// Server starten
private void button1_Click(object sender, EventArgs e)
{
// IPC Kanal registrieren
ChannelServices.RegisterChannel(new IpcChannel(sUniquePortName), false);
RemotingConfiguration.ApplicationName = sUniqueName;
// Klasse MyRemoteObject unter best. Namen registrieren
RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyRemoteObject), sURLService, WellKnownObjectMode.SingleCall);
}
// Client-Anfrage
private void button2_Click(object sender, EventArgs e)
{
// registriertes Objekt vom Typ ISharedAssemblyInterface über Adresse sURLClient suchen
ISharedAssemblyInterface obj = (ISharedAssemblyInterface)Activator.GetObject(typeof(ISharedAssemblyInterface), sURLClient);
if (obj != null)
{
// Funktion des Objektes ausführen
label1.Text = obj.Add(10, 10).ToString();
}
}
}