.NET Framework 2.0 コア機能解説 ~ 第 1 回 .NET リモーティング ~

中 博俊

MSMVP for C#

.NET Framework は1.x (Visual Studio 2002/2003) から2.0 (Visual Studio 2005) になり大きく進化しています。今回から週替わりで .NET の従来機能も踏まえつつ、.NET Framework 2.0 の新機能について解説していきたいと思います。

第 1 回目は .NET リモーティング (System.Runtime.Remoting) です。

◆ .NET リモーティングの威力

従来の .NET 以前のプログラム同士の通信はいろいろな手法がありますが、それぞれ通信部分を作成しなくてはいけなかったり、データが入ってきたかどうかをプーリングしたりといろいろとプログラマがフォローしなくてはいけないことがありました。 .NET Framework が登場したことにより、ここに XML Web サービスや、.NET リモーティング(以下、リモーティング)というものが追加されました。リモーティングはアプリケーション同士の通信を非常に簡単に行うことができ、通信が行われているということを従来ほどは意識する必要がなくなっています。

C# の例

RemotingLibrary.SisokuIPC si = new RemotingLibrary.SisokuIPC();
si.Add(1, 2); 

Visual Basic の例

Dim si As New RemotingLibrary.SisokuIPC()
si.Add(1, 2) 

いかがですか? 通常のクラスの呼び出しと変わらないことがわかると思います。これがリモーティングの透過プロキシの威力です。透過とは、ここで通信が行われているとは見た目わからないことを指します。

◆ リモーティングのチャンネル

通信を行うのですから、どのような方式で通信を行うかを決める必要があります。リモーティングの場合には 3 種類の通信方式を選択することができます。これをチャンネルといいます。

TCP はインターネット プロトコルの中心になるプロトコルです。主に LAN の内側での利用を想定されています。 HTTP は Web の閲覧などで利用されているプロトコルで、主にインターネットを経由したリモーティングや、ポートの制限のかかっているネットワーク間の通信を想定されています。 IPC が .NET Framework 2.0 になってから追加されました。同一コンピュータ内に限られるもののプロセス間通信を行う専用の方式ですし、速度はほかの追随を許しません。これらのチャンネルはネットワークなどの制約などにあわせて決まるものですが、IPC < TCP < HTTP の順に速度が遅くなりますので、それらを勘案して決めるとよいでしょう。

◆ 実際にリモーティングを行ってみよう。

実際にリモーティングを行うのは非常に簡単です。

(1) プロジェクトの構成と、参照設定を行う

リモーティングはクライアント側、サーバ側両方のアプリケーションからコンパイル時に参照できている必要がありますので、次の図のような構成を作成しましょう。

article01_fig01_big.gif

System.Runtime.Remoting.dll への参照設定も行っておきます。

(2) 呼び出されるクラスを作成する

リモーティングで呼び出しをされるクラスは MarshalByRefObject を継承して作成します。

C#  の例

public class MyClass : MarshalByRefObject
{
 public void MyMethod()
 {
 }
} 

Visual Basic の例

Public Class MyClass
 InheritsMarshalByRefObject
 Sub MyMethod()
 End Sub 
End Class 

(3) サーバ側の設定を行う

サーバ側でも利用するクラスをリモーティングで利用するという宣言を行うだけです。

ここでは IpcServerChannel のサンプルを確認してください。

http://msdn2.microsoft.com/ja-jp/library/system.runtime.remoting.channels.ipc.ipcserverchannel.aspx

(4) クライアント側の設定を行う

クライアント側 (呼び出し側) は利用するクラスをリモーティングで利用するという宣言を行うだけです。

ここでは IpcClientChannel のサンプルを確認してください。

http://msdn2.microsoft.com/ja-jp/library/system.runtime.remoting.channels.ipc.ipcclientchannel.aspx

このようにサーバ側、クライアント側それぞれ数行のコーディングでリモーティングによる通信ができるようになります。

◆ .NET Framework 2.0 での特徴

リモーティングが .NET Framework 2.0 になって IPC チャンネルが追加されただけではなく、他にも暗号化についてのサポートが行われています。

リモーティングを利用するためには ChannelService というクラスでチャンネルを登録する必要があります。この構文が .NET Framework 1.1 と .NET Framework 2.0 で変更されています。

.NET Framework 1.1 (C# の例 )

TcpClientChannel TCPChannel = new TcpClientChannel();
ChannelServices.RegisterChannel(TCPChannel); 

.NET Framework 2.0 (C# の例)

TcpClientChannel TCPChannel = new TcpClientChannel();
ChannelServices.RegisterChannel(TCPChannel, true); 

.NET Framework 1.1 (Visual Basic の例)

Dim TCPChannel As New TcpClientChannel()
ChannelServices.RegisterChannel(TCPChannel) 

.NET Framework 2.0 (Visual Basic の例)

Dim TCPChannel As New TcpClientChannel()
ChannelServices.RegisterChannel(TCPChannel, True) 

このように第 2 引数を設定するように変更されています。これに true を設定することでセキュリティ保護が効くようになります。この機能は SSPI (Security Support Provider Interface) という機能を利用しており、Windows 認証などと同じようにセキュリティの保護を享受できるようになります。

http://msdn2.microsoft.com/ja-jp/library/ms223155.aspx

また紙幅の関係で紹介できませんが、接続のキャッシュ タイムアウトとメソッドの再試行の回数も設定できるようになっています。

どうでしたか?皆さんもリモーティングを利用して、簡単にアプリケーション同士の連携を行うプログラムを作ってみてください。

◆ 参考資料

かなり古い資料ではありますが、リモーティングの仕組みを詳しく勉強するにはよい資料があります。

http://www.microsoft.com/japan/msdn/net/general/hawkremoting.aspx

リモーティングのこれらの設定は構成ファイル (App.config) に記述することにより外部設定とすることが可能です。

http://www.microsoft.com/japan/msdn/net/general/remotingconfig.aspx

表示: