.NET Framework 2.0新機能 IpcChannel – Remoting

.NET Framework 2.0の.NET Remotingに追加された機能として、IpcChannelがある。この追加されたIPCチャンネルの特徴は以下の通り

  1. IPCを使うので高速
  2. 同一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

コメントを残す