C#.Net間でプロセス間通信
About
異なるプロセス/アプリケーション/実行ファイル間でデータのやり取り・共有が必要になる場合があります。プロセス間通信(InterprocessCommunication)と呼ばれる技術ですが、.Netから提供される機能を利用すると容易に実現することができます。
ここではサンプルとして、2つのアプリケーション間で1つの値を持ったオブジェクトを共有します。それぞれのアプリケーションでボタンを押すと、共有するオブジェクトの値を1増やしてボタン上に現在の値を表示します。値の同期が取れていることを確認してください。
- &ref(): File not found: "WpfApplication1_InterProcessCommunication.zip" at page "Programming/.NetFramework/NetworkAndStream/InterProcessCommunication";
- VisualStudio2012
- WPF
C#.Netで開発されたアプリケーション同士で通信する実装が必要な状況は、実際にはそれほど多くないかもしれません。同じような実装が可能な環境下では、まとめて実装できるからです。
How to
サーバ側(データを持っている側)
プロセス間で通信するデータを保存するためのクラスを用意します。用意するクラスはMarshalByRefObjectクラスを継承している必要があります。
namespace IPCData { /// <summary> /// プロセス間通信サンプルのためのオブジェクト. /// </summary> public class MidObject:MarshalByRefObject { public int Count { get; set; } } }
データを通信するための経路"チャンネル"と、そこを通すデータの名前を指定します。受信側はそれらの名前を元にデータを受け取ることができます。
IPCData.MidObject midObject; …… //サーバサイドのチャンネルを生成. IpcServerChannel channel = new IpcServerChannel("SampleChannel"); //チャンネルを登録. ChannelServices.RegisterChannel(channel, true); RemotingServices.Marshal(midObject,"OpenData");
クライアント側
クライアント側でもサーバー側と同じようにプロセス間通信のためのデータの経路(チャンネル)を用意しておく必要があります。
//クライアントサイドのチャンネルを生成. IpcClientChannel channel = new IpcClientChannel(); //チャンネルを登録 ChannelServices.RegisterChannel(channel, true);
実際にデータを受け取ってみます。扱い方についてはソースコードを見てもらうとして、サーバ側で登録されたチャンネル名と共有するデータ名が重要になります。"Activator.GetObject"で指定するURIは、"ipc://チャンネル名/データ名"となります。
//リモートオブジェクトを取得 //URIは"ipc:/チャンネル名/公開名"になる. IPCData.MidObject midObject = Activator.GetObject (typeof(IPCData.MidObject), "ipc://SampleChannel/OpenData") as IPCData.MidObject; //カウントを1増やす midObject.Count++;
サンプルではSever側のプロジェクトに中間オブジェクトを実装していますが、実際には中間オブジェクトが含まれるDLLなどとして、サーバ側・クライアント側でそれぞれ参照できるように実装するのが良いでしょう。