次の方法で共有


サーバー アクティベーション

サーバー側でアクティブ化されるオブジェクトは、有効期間がサーバーによって直接制御されるオブジェクトです。これらのオブジェクトがサーバー アプリケーション ドメインで作成されるのは、クライアントがオブジェクトにメソッド呼び出しを実行したときだけであり、new (Visual Basic では New()) または Activator.GetObject を呼び出したときではありません。これにより、インスタンスの作成だけを目的とするネットワーク上でのやり取りを少なくできます。クライアントがサーバー側でアクティブ化される型のインスタンスを要求した場合は、クライアント アプリケーション ドメインにプロキシだけが作成されます。しかしこれは、既定の実装を使用する場合、サーバー側でアクティブ化される型に対して使用できるのは既定のコンストラクタだけという意味でもあります。引数を取る特定のコンストラクタによってインスタンスが作成される型を公開するには、クライアント アクティベーションを使用するか、または各インスタンスを動的に公開します。

サーバーのアクティベーション モード

サーバー側でアクティブ化されるオブジェクトには、SingletonSingleCall という 2 種類のアクティブベーション モード (つまり WellKnownObjectMode の値) があります。

Singleton 型は、一度に 1 つしかインスタンスを持ちません。インスタンスが 1 つ存在する場合、すべてのクライアント要求はそのインスタンスによって処理されます。インスタンスが存在しない場合はサーバーによってインスタンスが作成され、それ以降は、そのインスタンスを使ってすべてのクライアント要求を処理します。Singleton 型には既定の有効期間が関連付けられているため、利用できるインスタンスが一度に 1 つしかないとしても、クライアントはリモート処理可能クラスの同じインスタンスへの参照を受け取るとは限りません。

SingleCall 型は、クライアントの要求ごとに 1 つのインスタンスが生成されます。次のメソッド呼び出しは、前のインスタンスがシステムによってまだリサイクルされていない場合でも、別のサーバー インスタンスによって処理されます。SingleCall 型は有効期間リース システムには参加しません。

サーバー側でアクティブ化される型のインスタンスを作成するには、クライアントでそのアプリケーションをプログラムによって (または構成ファイルを使って) 構成し、new を呼び出すか、または Activator.GetObject への呼び出しでリモート オブジェクトの構成を渡します。

Noteメモ :

クライアント側でチャネルを登録しなくてもよい場合があります。クライアントでチャネルを登録していない場合、リモート処理システムは Machine.config ファイルで指定された既定のチャネルの 1 つを使用して自動的にチャネルを選択または作成することによって、要求を送信します。クライアントでのこの自動的なチャネル選択によって、サーバーからの任意のコールバック関数をリッスンするチャネルが登録されることはありません。また、カスタム チャネルが machine.config ファイルに追加されない限り、どのカスタム チャネルの実装も登録されません。この場合には、使用するチャネルの型をクライアント アプリケーション ドメインに登録する必要があります。

Activator.GetObject を呼び出すコード例を次に示します。この例では、TcpChannel がポート 8080 で通信するように登録されていると想定します。クライアントが、サーバー オブジェクトに特定のインターフェイスが実装されているという情報しか持っていない場合は、クラスのインスタンスを作成するために new (Visual Basic では New) しか使用できないため、Activator.GetObject への呼び出しを使用する必要があります。

Dim MyRemoteClass As RemoteObjectClass = _
   CType( _
      Activator.GetObject(GetType(RemoteObjectClass), _
         "tcp://computername:8080/RemoteObjectUri" ), _
      RemoteObjectClass
   ) 
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
   typeof(RemoteObjectClass),
   "tcp://computername:8080/RemoteObjectUri "
);

上に示した呼び出しでは、サーバーにリモート オブジェクトが作成されないことに注意してください。この呼び出しは、クライアントにそのリモート オブジェクトのローカル プロキシへの参照だけを返します。これによりクライアントは、MyRemoteClass をリモート オブジェクトへの直接の参照として扱うことができます。クライアントが一連のメソッド呼び出しの間に実際にどのインスタンスと通信するかは、サーバー オブジェクトが Singleton 型として宣言されているか、SingleCall 型として宣言されているかによって決まります。サーバー オブジェクトの発行者がこの情報を公開しているかどうかにかかわらず、クライアントはオブジェクト参照を同じであると見なします。

Singleton

COM では、"Singleton" とは、クライアントがオブジェクトへの参照を保持している限り、そのオブジェクトはメモリから削除されないことを意味していました。しかし .NET リモート処理では、Singleton オブジェクトには指定された有効期間リースが適用されるため、クライアントが現在そのオブジェクトに対する参照を保持している場合でも、そのオブジェクトはリサイクルできます。前者のタイプの Singleton オブジェクトを作成するには、MarshalByRefObjectInitializeLifetimeService メソッドをオーバーライドして、null 参照 (Visual Basic では Nothing) が返されるようにします。これによって事実上、オブジェクトはホスト アプリケーション ドメインが実行されている限りメモリに保持されます。詳細については、「有効期間リース」を参照してください。後者のタイプの Singleton オブジェクトを作成するには、リモート処理構成ファイルで初期リース時間を構成します。

参照

関連項目

WellKnownObjectMode 列挙体
Marshal

概念

リモート オブジェクトのアクティべーション
クライアント アクティベーション
有効期間リース