Interprozess-Kommunikation (IPC)

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.

  • weiterführende Infos: MSDN, Client + Server
  • Noch ein Beispiel: Link
  • Klasse für gemeinsames Objekt
// 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();
        }
    }
}