プロセス間通信(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 { get; set; } /// <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 { get; set; } /// <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 { get; set; } } }
サーバー側プログラムで IpcServer のインスタンスを生成し、クライアント側のプログラムで IpcClient を生成します。
それぞれ別々プロセスで動作していますが、各クラスのプロパティ RemoteObject は同じインスタンスを共有しているようなイメージになります。
また、クライアント側は複数生成することができ、1対多で RemoteObject を共有することができます。
ここまでは簡単なのですが、これらのサンプルには下の問題が発生する場合がありますので、下のページも確認して下さい。