C# プロセス間通信(IPC)

[English]

プロセス間通信(IPC)は複数のプログラム(プロセス)間で情報をやりとりするための仕組みです。
.NET Frameworkには.Netリモーティングというプロセス間通信の機能がありますので、それを使用することで簡単にプロセス間通信を行うとができます。

通信の方式はTCP, HTTP, IPC と3種類の通信方式から選択することができます。同一マシン上でのプロセス間通信を行う場合、IPCチャンネルを使用します。

まずはMSDNのサンプルコードを元に簡単なプロセス間通信を実現してみます。

サーバー側

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
 
namespace IpcSample
{
    class IpcServer
    {
        public IpcRemoteObject RemoteObject { getset; }
    
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public IpcServer()
        {
            // サーバーチャンネルの生成
            IpcServerChannel channel = new IpcServerChannel("ipcSample");
    
            // チャンネルを登録
            ChannelServices.RegisterChannel(channel, true);
    
            // リモートオブジェクトを生成して公開
            RemoteObject = new IpcRemoteObject();
            RemotingServices.Marshal(RemoteObject, "test"typeof(IpcRemoteObject));
        }
    }
}

※プログラムで参照設定で「System.Runtime.Remoting」を追加する必要があります。

クライアント側

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
 
namespace IpcSample
{
    class IpcClient
    {
        public IpcRemoteObject RemoteObject { getset; }
    
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public IpcClient()
        {
            // クライアントチャンネルの生成
            IpcClientChannel channel = new IpcClientChannel();
    
            // チャンネルを登録
            ChannelServices.RegisterChannel(channel, true);
    
            // リモートオブジェクトを取得
            RemoteObject = Activator.GetObject(typeof(IpcRemoteObject), "ipc://ipcSample/test"as IpcRemoteObject;
        }
    }
}

※プログラムで参照設定で「System.Runtime.Remoting」を追加する必要があります。

リモートオブジェクト

using System;
 
namespace IpcSample
{
    public class IpcRemoteObject : MarshalByRefObject
    {
        public int Counter { getset; }
    }
}

サーバー側プログラムで IpcServer のインスタンスを生成し、クライアント側のプログラムで IpcClient を生成します。
それぞれ別々プロセスで動作していますが、各クラスのプロパティ RemoteObject は同じインスタンスを共有しているようなイメージになります。
また、クライアント側は複数生成することができ、1対多で RemoteObject を共有することができます。

ここまでは簡単なのですが、これらのサンプルには下の問題が発生する場合がありますので、下のページも確認して下さい。

使用環境: Visual Studio 2010 .NET Framework 4

C# メニューリスト