Visual Basic 2005 または Visual Basic .NET を使用してオブジェクトを参照渡しでリモート サーバーにマーシャリングする方法

この記事は、以前は次の ID で公開されていました: JP301112
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
Microsoft Visual C# .NET については、次の資料を参照してください。307600
概要
この資料では、オブジェクトを参照渡しでリモート サーバーにマーシャリングする方法について説明します。オブジェクトを参照渡しでマーシャリングすると、ランタイムにより透過プロキシが作成され、クライアント上のオブジェクトをサーバーから呼び出すことができます。サーバーには、このプロキシだけが送信されます。このプロキシによって、クライアントへのコールバックがマーシャリングされます。

この資料は、サーバー オブジェクト、サーバー アプリケーション、およびクライアント アプリケーションという 3 つの部分に分かれています。この資料は、次の「サポート技術情報」 (Microsoft Knowledge Base) の資料を補足するものです。
300951 Visual Basic .NET を使用してリモート サーバーを作成する方法
300943 Visual Basic .NET を使用してリモート サーバーにアクセスするクライアントを作成する方法

必要条件

必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack は次のとおりです。
  • Microsoft Windows Server 2003、Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server、または Microsoft Windows NT 4.0 Server
  • Microsoft Visual Studio 2005 または Microsoft Visual Studio .NET
この資料は、次のトピックについて詳しい知識のあるユーザーを対象としています。
  • Visual Studio 2005 または Visual Studio .NET
  • ネットワークの基礎

オブジェクト渡しによるリモート サーバー オブジェクトの作成

サーバー アプリケーションを作成するには、まずサーバー オブジェクトを作成する必要があります。サーバー オブジェクトは、クライアント アプリケーションによってサーバー上でインスタンスが作成されるもので、クライアント アプリケーションの通信相手となります。クライアント アプリケーションは、クライアント上で作成されたプロキシ オブジェクトを介してこの処理を実行します。作成するサーバー オブジェクトは、クラス ライブラリ (DLL) に含まれ、HelloServer という名前です。同じプロジェクトで、クライアントからサーバーに渡されるクラスの定義も行います。これは ForwardMe というクラスです。ForwardMe クラスのオブジェクトを参照渡しでマーシャリングするため、このクラスは MarshalByRefObject から継承する必要があります。
  1. Visual Studio 2005 または Visual Studio .NET を起動します。
  2. ServerClassRef という名前でクラス ライブラリ アプリケーションを作成します。
  3. クラス Class1.vb の名前を ServerClassRef.vb に変更します。
  4. ServerClassRef.vb を開き、HelloServerForwardMe という、MarshalByRefObject から継承した 2 つのクラスを追加します。HelloServer クラスは、クライアント アプリケーションによって使用されるメイン クラスになります。ForwardMe クラスは、クライアントからサーバーにオブジェクトのデータを送信するために使用されます。ServerClassRef.vb ファイルのコードを以下に示します。
    Public Class HelloServer	Inherits MarshalByRefObjectEnd ClassPublic Class ForwardMe	Inherits MarshalByRefObjectEnd Class					
  5. 引数として ForwardMe オブジェクトを 1 つ取る HelloMethod という名前のパブリック メソッドを HelloServer に追加します。このメソッドを使用して、ForwardMe オブジェクトをサーバーに渡します。このメソッドは、渡されたオブジェクトの CallMe メソッドを呼び出します。HelloServer クラスのコードを以下に示します。
    Public Class HelloServer    Inherits MarshalByRefObject    Public Sub HelloMethod(ByRef obj As ForwardMe)        Dim i As Integer        obj.CallMe()    End SubEnd Class					
  6. パブリック メソッドを ForwardMe クラスに追加します。このメソッドは、このコードが実行されているプロセスの名前を取得します。単にプロキシ スタブをサーバーに送信し、クライアントへのコールバック (参照渡しによるマーシャリング) を行うだけなので、このコードはクライアント プロセスで実行されます。
    Public Class ForwardMe    Inherits MarshalByRefObject    Public Function CallMe() As Object        Console.WriteLine("CallMe was executed in: " & _        Process.GetCurrentProcess.ProcessName.ToString)    End FunctionEnd Class					
  7. プロジェクトをビルドして、アセンブリ ServerClassRef.dll を作成します。
  8. プロジェクトを閉じて保存します。

リモート サーバー アプリケーションの作成

クライアントの通信相手となるサーバー オブジェクトを作成したら、このオブジェクトを Remoting フレームワークに登録する必要があります。登録には、オブジェクトの登録だけでなく、サーバーを起動して、クライアントが接続するポートを監視させることも含まれます。これを行うには、実行可能ファイルを出力するプロジェクトの種類を選択することが必要です。サーバー オブジェクトを別のプロジェクトに入れた理由は、クライアントからサーバー オブジェクトを容易に参照できるようにするためです。サーバー オブジェクトをこのプロジェクトに含めると、参照先として指定できるのは DLL ファイルだけであるため、サーバー オブジェクトを参照できません。
  1. Visual Studio 2005 または Visual Studio .NET を起動します。
  2. 簡単にするため、リモート サーバーを起動する新しいコンソール アプリケーションを作成し、ServerObjectRef という名前を付けます。
  3. デフォルトで作成されるファイル Module1.vb の名前を ServerObjectRef.vb に変更します。
  4. System.Runtime.Remoting 名前空間への参照をこのプロジェクトに追加します。
  5. 先に作成したアセンブリ ServerClassRef.dll への参照を追加します。
  6. Remoting、Remoting.Channels、Remoting.Channels.TCP の各名前空間に対して Imports ステートメントを使用します。こうすることで、後のコードではこれらの名前空間に含まれる宣言に修飾子が必要なくなります。Imports ステートメントは、他の宣言よりも先に使用する必要があります。
    Imports System.Runtime.RemotingImports System.Runtime.Remoting.ChannelsImports System.Runtime.Remoting.Channels.TCP					
  7. 変数を宣言して、特定のポート (この場合はポート 8085) に接続するクライアントを監視する TcpChannel オブジェクトを初期化します。RegisterChannel メソッドを使用して、クライアントが通信に使用するチャネルをチャネル サービスに登録します。次の宣言コードを Module1 の Main プロシージャに追加します。
    Dim chan As TcpChannel = New TcpChannel(8085)ChannelServices.RegisterChannel(chan)					
  8. RemotingConfiguration オブジェクトの RegisterWellKnownType メソッドを呼び出して、ServerClassRef オブジェクトを Remoting フレームワークに登録します。次の指定を行う必要があります。
    1. 登録するオブジェクトの完全な型名 (この場合は ServerClassRef.HelloServer) とそれに続くアセンブリ名 ServerClassRef。クラス名と名前空間の名前を両方とも指定する必要があります。前の部分で名前空間を指定していないため、デフォルトのルート名前空間が使用されます。
    2. 次に、オブジェクトを公開するエンドポイントの名前を指定します。クライアントがオブジェクトに接続するには、この名前が必要です。RemoteTestRef を使用します。
    3. 最後のパラメータでは、オブジェクトのモードとして SingleCall か Singleton のどちらかを指定します。この例では SingleCall を指定します。オブジェクト モードは、オブジェクトがサーバー上でアクティブになったときの有効期間を指定するものです。SingleCall オブジェクトの場合、同じクライアントが同じメソッドを複数回呼び出した場合でも、クライアントから要求があるたびに、そのクラスの新しいインスタンスが作成されます。これに対して Singleton オブジェクトは一度しか作成されず、すべてのクライアントが同じオブジェクトと通信します。
      RemotingConfiguration.RegisterWellKnownServiceType( _ Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _ "RemoteTestRef", _ WellKnownObjectMode.SingleCall)						
  9. Console オブジェクトの ReadLine メソッドを使用して、サーバー アプリケーションを実行中の状態で維持します。
    Console.WriteLine("Hit <enter> to exit...")Console.ReadLine()					
  10. プロジェクトをビルドします。
  11. プロジェクトを閉じて保存します。

オブジェクト渡しによるリモート サーバーへのクライアントの作成

  1. Visual Studio 2005 または Visual Studio .NET を起動します。
  2. ClientAppRef という名前で新しいコンソール アプリケーションを作成します。
  3. デフォルトで作成されるファイル Module1.vb の名前を ClientAppRef.vb に変更します。
  4. System.Runtime.Remoting 名前空間への参照をこのプロジェクトに追加します。
  5. この資料で先に作成したアセンブリ ServerClassRef.dll への参照を追加します。
  6. Remoting、Remoting.Channels、Remoting.Channels.TCP の各名前空間に対して Imports ステートメントを使用します。こうすることで、後のコードではこれらの名前空間に含まれる宣言に修飾子が必要なくなります。Imports ステートメントは、他の宣言よりも先に使用する必要があります。
    Imports System.Runtime.RemotingImports System.Runtime.Remoting.ChannelsImports System.Runtime.Remoting.Channels.TCP					
  7. 変数を宣言して、クライアントがサーバー アプリケーションに接続するために使用する TcpChannel オブジェクトを初期化します。TcpChannel オブジェクトを初期化して双方向通信を可能にする際、ポートを指定する必要があります。これは、オブジェクトを参照渡しでマーシャリングし、サーバーがクライアントへのコールバックを行う必要があるためです。このポートを使用して、その処理が行われます。このポートは、データの送信に使用するポートとは別にする必要があります。RegisterChannel メソッドを使用して、チャネル サービスにチャネルを登録します。次に、リモート サーバーに渡される新しい ForwardMe オブジェクトを初期化する必要があります。次の宣言コードを Module1 の Main プロシージャに追加します。
    Dim chan As TcpChannel = New TcpChannel(8086)ChannelServices.RegisterChannel(chan)Dim objForwardMe As New ServerClassRef.ForwardMe()					
  8. これでリモート サーバーを宣言し、インスタンス化することができます。この場合は、Activator オブジェクトの GetObject メソッドを使用して、HelloServer オブジェクトをインスタンス化します。次の指定を行う必要があります。
    1. 登録するオブジェクトの完全な型名 (この場合は ServerClassRef.HelloServer) とそれに続くアセンブリ名 ServerClassRef。ここには、クラス名と名前空間の名前を両方とも指定する必要があります。前の部分で名前空間を指定していないため、デフォルトのルート名前空間が使用されます。
    2. アクティブにするオブジェクトの URI (Uniform Resource Identifier)。URI にはプロトコル (tcp)、コンピュータ名 (localhost)、ポート (8085)、およびサーバー オブジェクトのエンドポイント (RemoteTestRef) を含める必要があります。URI "tcp://localhost:8085/RemoteTestRef" を使用して、ServerClass リモート サーバーにアクセスします。
      Dim objHelloServer As ServerClassRef.HelloServerobjHelloServer = CType(Activator.GetObject( _    Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _    "tcp://localhost:8085/RemoteTestRef"), _    ServerClassRef.HelloServer)If objHelloServer Is Nothing Then    Console.WriteLine("Could not locate server")Else    'See next stepEnd If						
  9. サーバー オブジェクトが正常にインスタンス化されたら、サーバー オブジェクトのメソッドを呼び出して、新たに作成した objForwardMe オブジェクトを渡すことができます。変更された文字列が結果として返されるので、これを表示します。
    Dim objHelloServer As ServerClassRef.HelloServerobjHelloServer = CType(Activator.GetObject( _	Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _	"tcp://localhost:8085/RemoteTestRef"), _	ServerClassRef.HelloServer)If objHelloServer Is Nothing Then	Console.WriteLine("Could not locate server")Else	objHelloServer.HelloMethod(objForwardMe)End If					
  10. Console オブジェクトの ReadLine メソッドを使用して、クライアント アプリケーションを実行中のまま維持します。
    Console.WriteLine("Hit <enter> to exit...")Console.ReadLine()					
  11. プロジェクトをビルドします。
  12. サーバー アプリケーションが実行中であることを確認します。
  13. プロジェクトを実行して、クライアントからサーバーへの通信をテストします。クライアントのコンソール ウィンドウに出力が表示されます。参照渡しのマーシャリングが行われるので、クライアントへのコールバックが行われます。
関連情報
.NET リモート処理の概要 (.NET Framework 開発者ガイド)

TcpChannel クラス (.NET Framework クラス ライブラリ)

.NET Framework サンプル : リモート処理Microsoft .NET Remoting: 技術概要Activator.GetObject メソッド (.NET Framework クラス ライブラリ)

Type.GetType メソッド (.NET Framework クラス ライブラリ)

RegisterWellKnownServiceType メソッド (.NET Framework クラス ライブラリ)
プロパティ

文書番号:301112 - 最終更新日: 02/24/2014 15:34:27 - リビジョン: 5.1

  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • kbnosurvey kbarchive kbhowtomaster kbvs2005applies kbvs2005swept KB301112
フィードバック