Visual C# を使用してリモート サーバーを作成する

この記事では、Visual C# を使用して別のアプリケーションがアクセスできるリモート サーバーを作成するのに役立ちます。

元の製品バージョン: Visual C#
元の KB 番号: 307445

概要

この記事では、別のアプリケーションがアクセスできるリモート サーバーを作成する方法について説明します。 このサーバーにアクセスするアプリケーションは、同じコンピューター、別のコンピューター、または別のネットワーク上に配置できます。 リモート サーバーは、サーバー オブジェクトとサーバー アプリケーションの 2 つの部分に分割されます。 サーバー オブジェクトは、クライアントが通信するオブジェクトであり、サーバー アプリケーションを使用して、サーバー オブジェクトを .NET Remoting ランタイム フレームワークに登録します。

この記事では、次の Microsoft .NET Framework クラス ライブラリ名前空間について説明します。

  • System.Runtime.Remoting
  • System.Runtime.Remoting.Channels
  • System.Runtime.Remoting.Channels.Tcp

要件

この記事では、次のトピックについて理解していることを前提としています。

  • Visual Studio .NET または Visual Studio
  • Visual C# .NET または Visual C#
  • ネットワーク

リモート サーバー オブジェクトの作成

サーバー アプリケーションを作成する最初の手順は、サーバー オブジェクトを作成することです。 サーバー オブジェクトは、クライアント アプリケーションがサーバー コンピューター上でインスタンス化して通信するオブジェクトです。 クライアント アプリケーションは、クライアントで作成されたプロキシ オブジェクトを介してこれを行います。 このサンプルでは、サーバー オブジェクトはクラス ライブラリ (DLL) に存在し、 myRemoteClass と呼ばれます。

  1. Visual C# .NET で新しいクラス ライブラリ アプリケーションを作成します。 プロジェクトに ServerClass という名前を 付けます。 Class1 は既定で作成されます。

  2. ソリューション エクスプローラーで、Class1.cs コード ファイルの名前を ServerClass.cs に変更します

  3. ServerClass.cs開き、Class1 の名前を myRemoteClass に変更します。 また、クラス名と一致するように、 クラスの既定のコンストラクターの名前を に変更する必要もあります。 myRemoteClass は クラスから継承する MarshalByRefObject 必要があります。 これで、クラスは次のように表示されます。

    public class myRemoteClass: MarshalByRefObject
    {
        public myRemoteClass()
        {
          // TO DO: Add constructor logic here.
        }
    }
    
  4. 文字列を受け取り、文字列の値を含むメッセージをコンソールに表示し、文字列が空でない場合は True を返すパブリック メソッドを myRemoteClass に追加します。

    public bool SetString(String sTemp)
    {
         try
         {
             Console.WriteLine("This string '{0}' has a length of {1}", sTemp, sTemp.Length);
             return sTemp != "";
         }
         catch
         {
             return false;
         }
    }
    
  5. プロジェクトをビルドして 、ServerClass.dll アセンブリを作成します。

  6. プロジェクトを保存して閉じます。

リモート サーバー アプリケーションを作成する

クライアントが通信するサーバー オブジェクトを作成したら、このオブジェクトを Remoting フレームワークに登録する必要があります。 オブジェクトを登録するときは、サーバーを起動し、クライアントがそのポートに接続するためのポートをリッスンする必要もあります。 これを行うには、実行可能ファイルを出力するプロジェクトの種類が必要です。

サーバー オブジェクトを別のプロジェクトに含める理由は、クライアント プロジェクトからサーバー オブジェクトを簡単に参照できるようにするためです。 このプロジェクトに含める場合、参照は DLL ファイルにのみ設定できるため、参照できません。

  1. Visual C# .NET で新しいコンソール アプリケーションを作成して、リモート サーバーを起動します。 Class1 は既定で作成されます。

  2. ソリューション エクスプローラーで、Class1.cs ファイルの名前を RemoteServer.cs に変更します

  3. 名前空間への参照を System.Runtime.Remoting 追加します。

  4. 前のセクションで作成した ServerClass.dll アセンブリへの参照を追加します。

  5. コードのusing後半でこれらの名前空間のRemotingRemoting.Channels宣言を修飾する必要がないように、 、、および Remoting.Channels.TCP 名前空間の ステートメントを使用します。 他の宣言の前に ステートメント using を使用する必要があります。

    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    
  6. 適切な変数を宣言します。 クライアントが特定の TcpChannel ポート (この例ではポート 8085) で接続をリッスンするオブジェクトを宣言して初期化します。 チャネル サービスに RegisterChannel チャネルを登録するには、 メソッドを使用します。 のプロシージャClass1に次の宣言コードをMain追加します。

    TcpChannel chan = new TcpChannel(8085);
    ChannelServices.RegisterChannel(chan);
    
  7. オブジェクトの メソッドをRegisterWellKnownTypeRemotingConfiguration呼び出して、オブジェクトを ServerClass Remoting フレームワークに登録し、次のパラメーターを指定します。

    • 登録されているオブジェクトの完全な型名 (この例では ServerClass.myRemoteClass ) の後に、アセンブリ名 ServerClass が続きます。 名前空間の名前とクラス名の両方をここで指定します。 前のセクションでは名前空間を指定していないため、既定のルート名前空間が使用されます。

    • オブジェクトを発行するエンドポイントに RemoteTest という名前を 付けます。 クライアントは、オブジェクトに接続するためにこの名前を認識する必要があります。

    • オブジェクト モードを SingleCall 使用して、最終的なパラメーターを指定します。 オブジェクト モードでは、サーバーでアクティブ化されたときのオブジェクトの有効期間を指定します。 オブジェクトの SingleCall 場合、同じクライアントが同じメソッドを複数回呼び出した場合でも、クライアントが行う呼び出しごとにクラスの新しいインスタンスが作成されます。 一方、 Singleton オブジェクトは 1 回だけ作成され、すべてのクライアントが同じオブジェクトと通信します。

      RemotingConfiguration.RegisterWellKnownServiceType(
      System.Type.GetType("ServerClass.myRemoteClass, ServerClass"),
      "RemoteTest",
      WellKnownObjectMode.SingleCall);
      
  8. サーバー アプリケーションの ReadLine 実行を Console 維持するには、 オブジェクトの メソッドを使用します。

    System.Console.WriteLine("Hit <enter> to exit...");
    System.Console.ReadLine();
    
  9. プロジェクトをビルドします。

  10. プロジェクトを保存して閉じます。

関連情報

.NET リモート処理の概要については、.NET Framework開発者ガイドのドキュメントを参照してください。