.NET Framework 2.0の.NET Remotingに追加された機能として、IpcChannelがある。この追加されたIPCチャンネルの特徴は以下の通り
- IPCを使うので高速
- 同一PC内のAppドメイン間のリモートオブジェクト呼び出しにのみ使用できる。ネットワーク越しのリモートオブジェクト呼び出しとしては利用できない
新機能だが、以下のコードのように今までのTcpチャンネルとほぼ同じコーディングスタイルでコーディングが行える。
サーバ側コード:
001 using System; 002 using System.Collections.Generic; 003 using System.Text; 004 using System.Runtime.Remoting; 005 using System.Runtime.Remoting.Channels; 006 using System.Runtime.Remoting.Channels.Ipc; 007 using isisaka.com.Remoting.Sample.Core; 008 009 namespace RemotingServer 010 { 011 /// <summary> 012 /// CAO(Client Activate Object)のServer側サンプル 013 /// </summary> 014 class RemotingServer 015 { 016 static void Main(string[] args) { 017 Console.WriteLine("サーバが立ち上がります・・・ "); 018 //通信チャンネルを登録。IPCチャンネルを使用する。 019 //作成するIPCポートの名前をコンストラクタで指定する。 020 ChannelServices.RegisterChannel(new IpcChannel("IpcSample")); 021 022 //サービスタイプを登録 023 //CAOではSAOと違い、RegisterActivatedServiceTypeメソッドで、 024 //クライアントから要求があったときに活性化させるオブジェクトを 025 //指定します。 026 RemotingConfiguration.RegisterActivatedServiceType(typeof(Core)); 027 RemotingConfiguration.ApplicationName = "SampleApp"; 028 Console.WriteLine("[Return]キーを押すと、サーバを停止することができます。"); 029 Console.ReadLine(); 030 } 031 } 032 } 033
クライアント側コード:
001 using System; 002 using System.Collections.Generic; 003 using System.ComponentModel; 004 using System.Data; 005 using System.Drawing; 006 using System.Text; 007 using System.Windows.Forms; 008 using System.Runtime.Remoting; 009 using System.Runtime.Remoting.Channels; 010 using System.Runtime.Remoting.Channels.Ipc; 011 using isisaka.com.Remoting.Sample.Core; 012 013 namespace RemotingClient 014 { 015 public partial class Form1 : Form 016 { 017 private Core remoteObject; 018 public Form1() { 019 InitializeComponent(); 020 } 021 022 private void Form1_Load(object sender, EventArgs e) { 023 //Channelを登録。IPCチャンネルを使用。 024 ChannelServices.RegisterChannel(new IpcChannel()); 025 026 //Proxy Objectの生成 027 //リモートで使用するオブジェクトを指定する。 028 //urlの書き方はipc://"ipc ポート名"/"アプリケーション名" 029 RemotingConfiguration.RegisterActivatedClientType(typeof(Core), "ipc://IpcSample/SampleApp"); 030 //普通にインスタンスを作る。 031 remoteObject = new Core(); 032 033 } 034 035 private void button1_Click(object sender, EventArgs e) { 036 label1.Text = remoteObject.CountUp().ToString() + "回目の呼び出しです"; 037 } 038 } 039 }
以前よりリモーティングの開発を行ってきた方にとっては、特に違和感のないコードであることが解ると思う。実測してみれば解ることだが、TcpChannelに比べてもだいたい1.5倍から2倍の速度が出ているので、同一Box内でのプロセスか通信の手段が必要な場合には一考する価値があると思う。少なくとも自分でAPIを使用してIPCを使用するよりも遙かに少ないコーディング量で安全に使用することが出来る。
サンプルコード(VS 2005 Beta2が必要)
CAO IPC Demo.LZH
コメント