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 と呼ばれます。
Visual C# .NET で新しいクラス ライブラリ アプリケーションを作成します。 プロジェクトに ServerClass という名前を 付けます。 Class1 は既定で作成されます。
ソリューション エクスプローラーで、Class1.cs コード ファイルの名前を ServerClass.cs に変更します。
ServerClass.cs開き、Class1 の名前を myRemoteClass に変更します。 また、クラス名と一致するように、 クラスの既定のコンストラクターの名前を に変更する必要もあります。 myRemoteClass は クラスから継承する
MarshalByRefObject
必要があります。 これで、クラスは次のように表示されます。public class myRemoteClass: MarshalByRefObject { public myRemoteClass() { // TO DO: Add constructor logic here. } }
文字列を受け取り、文字列の値を含むメッセージをコンソールに表示し、文字列が空でない場合は 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; } }
プロジェクトをビルドして 、ServerClass.dll アセンブリを作成します。
プロジェクトを保存して閉じます。
リモート サーバー アプリケーションを作成する
クライアントが通信するサーバー オブジェクトを作成したら、このオブジェクトを Remoting フレームワークに登録する必要があります。 オブジェクトを登録するときは、サーバーを起動し、クライアントがそのポートに接続するためのポートをリッスンする必要もあります。 これを行うには、実行可能ファイルを出力するプロジェクトの種類が必要です。
サーバー オブジェクトを別のプロジェクトに含める理由は、クライアント プロジェクトからサーバー オブジェクトを簡単に参照できるようにするためです。 このプロジェクトに含める場合、参照は DLL ファイルにのみ設定できるため、参照できません。
Visual C# .NET で新しいコンソール アプリケーションを作成して、リモート サーバーを起動します。 Class1 は既定で作成されます。
ソリューション エクスプローラーで、Class1.cs ファイルの名前を RemoteServer.cs に変更します。
名前空間への参照を
System.Runtime.Remoting
追加します。前のセクションで作成した ServerClass.dll アセンブリへの参照を追加します。
コードの
using
後半でこれらの名前空間のRemoting
Remoting.Channels
宣言を修飾する必要がないように、 、、およびRemoting.Channels.TCP
名前空間の ステートメントを使用します。 他の宣言の前に ステートメントusing
を使用する必要があります。using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
適切な変数を宣言します。 クライアントが特定の
TcpChannel
ポート (この例ではポート 8085) で接続をリッスンするオブジェクトを宣言して初期化します。 チャネル サービスにRegisterChannel
チャネルを登録するには、 メソッドを使用します。 のプロシージャClass1
に次の宣言コードをMain
追加します。TcpChannel chan = new TcpChannel(8085); ChannelServices.RegisterChannel(chan);
オブジェクトの メソッドを
RegisterWellKnownType
RemotingConfiguration
呼び出して、オブジェクトをServerClass
Remoting フレームワークに登録し、次のパラメーターを指定します。登録されているオブジェクトの完全な型名 (この例では ServerClass.myRemoteClass ) の後に、アセンブリ名 ServerClass が続きます。 名前空間の名前とクラス名の両方をここで指定します。 前のセクションでは名前空間を指定していないため、既定のルート名前空間が使用されます。
オブジェクトを発行するエンドポイントに RemoteTest という名前を 付けます。 クライアントは、オブジェクトに接続するためにこの名前を認識する必要があります。
オブジェクト モードを
SingleCall
使用して、最終的なパラメーターを指定します。 オブジェクト モードでは、サーバーでアクティブ化されたときのオブジェクトの有効期間を指定します。 オブジェクトのSingleCall
場合、同じクライアントが同じメソッドを複数回呼び出した場合でも、クライアントが行う呼び出しごとにクラスの新しいインスタンスが作成されます。 一方、Singleton
オブジェクトは 1 回だけ作成され、すべてのクライアントが同じオブジェクトと通信します。RemotingConfiguration.RegisterWellKnownServiceType( System.Type.GetType("ServerClass.myRemoteClass, ServerClass"), "RemoteTest", WellKnownObjectMode.SingleCall);
サーバー アプリケーションの
ReadLine
実行をConsole
維持するには、 オブジェクトの メソッドを使用します。System.Console.WriteLine("Hit <enter> to exit..."); System.Console.ReadLine();
プロジェクトをビルドします。
プロジェクトを保存して閉じます。
関連情報
.NET リモート処理の概要については、.NET Framework開発者ガイドのドキュメントを参照してください。