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

文書翻訳 文書翻訳
文書番号: 301112 - 対象製品
この記事は、以前は次の 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 MarshalByRefObject
    
    End Class
    Public Class ForwardMe
    	Inherits MarshalByRefObject
    
    End 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 Sub
    End Class
    					
  6. パブリック メソッドを ForwardMe クラスに追加します。このメソッドは、このコードが実行されているプロセスの名前を取得します。単にプロキシ スタブをサーバーに送信し、クライアントへのコールバック (参照渡しによるマーシャリング) を行うだけなので、このコードはクライアント プロセスで実行されます。
    Public Class ForwardMe
        Inherits MarshalByRefObject
    
        Public Function CallMe() As Object
            Console.WriteLine("CallMe was executed in: " & _
            Process.GetCurrentProcess.ProcessName.ToString)
        End Function
    
    End 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.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports 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.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports 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.HelloServer
      
      objHelloServer = 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 step
      End If
      						
  9. サーバー オブジェクトが正常にインスタンス化されたら、サーバー オブジェクトのメソッドを呼び出して、新たに作成した objForwardMe オブジェクトを渡すことができます。変更された文字列が結果として返されるので、これを表示します。
    Dim objHelloServer As ServerClassRef.HelloServer
    
    objHelloServer = 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 サンプル : リモート処理
http://www.microsoft.com/japan/msdn/library/ja/cpqstart/html/cpsmpnetsamples-howtoremoting.asp
Microsoft .NET Remoting: 技術概要
http://www.microsoft.com/japan/msdn/net/general/hawkremoting.asp
Activator.GetObject メソッド (.NET Framework クラス ライブラリ)

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

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

プロパティ

文書番号: 301112 - 最終更新日: 2014年2月24日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com