次の方法で共有


リモート処理のバージョン情報

このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。

リモート処理は、厳密な名前付きアセンブリを処理するように設計されています。厳密な名前をリモート処理で使用する場合は、次の基本的な規則が適用されます。

  • IMethodCallMessageインターフェイス実装の TypeName プロパティには常にバージョンが含まれます。

  • IConstructionCallMessage インターフェイス実装の ActivationTypeName プロパティには常にバージョンが含まれます。

  • ObjRef オブジェクトに格納されている TypeInfo プロパティには常にバージョンが含まれます。

  • リモート処理の他のすべてのバージョン管理は、使用されているフォーマッタの includeVersions プロパティによって決まります。既定では、BinaryFormatter オブジェクトではバージョン情報が生成されますが、SoapFormatter オブジェクトでは生成されません。このプロパティは、チャネルの生成時にプログラムを使用して変更するか、リモート処理構成ファイルで設定することができます。

ここでは、これらの規則がオブジェクト参照に与える影響と、リモート処理で一般的に使用されるさまざまなアクティベーション モデルについて説明します。

サーバー側でアクティブ化されるオブジェクト

サーバー側でアクティブ化される (<wellknown>) オブジェクトにクライアントが接続するときには、アクティブ化される型のバージョンはサーバーが制御します。サービスの構成時にバージョン情報を指定しない場合、オブジェクトをアクティブ化するときに最新バージョンのアセンブリが使用されます。たとえば、MyHello バージョン 1.0.0.0 と MyHello バージョン 2.0.0.0 の 2 つのアセンブリがあるとします。バージョン情報が指定されていない場合、well-known オブジェクトはバージョン 2.0 のアセンブリを使用してアクティブ化されます。クライアントがビルドされたときに参照されていたバージョンとは関係なくこのバージョンが使用されるという点に注意してください。

アセンブリの特定のバージョンを使用するようにサービスを構成できます。たとえば、次の構成ファイルはバージョンの指定方法を示しています。アセンブリがグローバル アセンブリ キャッシュ内にある場合は、カルチャ情報や公開キーを含め、すべての型情報を指定する必要があります。次の構成例では、バージョン管理に重点を置いているため、厳密な名前の情報が省略されています。

<configuration>
<system.runtime.remoting>
   <application name="RemotingHello">
      <lifetime 
         leaseTime="20ms" 
         sponsorshipTimeOut="20ms"
         renewOnCallTime="20ms" 
      />
      <service>
         <wellknown 
            mode="SingleCall" 
            type="Hello.HelloService,MyHello,Version=1.0.0.0,<strong name omitted>"
            objectUri="HelloService.soap" 
         />
         <activated 
            type="Hello.AddService, MyHello"
         />
      </service>
      <channels>
         <channel 
            port="8000"
            ref="tcp"
         >
         </channel>
      </channels>
   </application>
</system.runtime.remoting>
</configuration>

このファイルでは、バージョン 1.0.0.0 の MyHello アセンブリをそのクライアントのオブジェクトを作成するときに使用するよう指定しています。エンドポイントに同じオブジェクトの複数のバージョンを指定した場合、オブジェクトをアクティブにするときには、最後に指定したバージョンが使用されます。同じオブジェクトのバージョン間で重要な変更を行うと、クライアントに悪影響を与える場合があることに注意してください。バージョン間でメソッド パラメーターを追加または変更した場合に、バージョン 1.0 に対してコンパイルされたクライアントをバージョン 2.0 に対して使用すると、例外がスローされます。したがって、バージョン間で重要な変更を行った場合は、新しいバージョンのオブジェクトを別のエンドポイントでホストすることをお勧めします。

クライアント側でアクティブ化されるオブジェクト

クライアント側でアクティブ化される (<activated>) オブジェクトをクライアントがアクティブにするときには、要求されたオブジェクトがアクティブ化されるサーバーにネットワーク呼び出しが送信されて、そのオブジェクトへのオブジェクト参照がクライアントに返されます。オブジェクトのアクティブ化はクライアントによって指示されるので、アクティブにするオブジェクトのバージョンもクライアントが選択します。たとえば、クライアントがバージョン 1.0 のオブジェクトに対してビルドされている場合は、バージョン 1.0 の HelloService がサーバーでアクティブ化されます。クライアントがバージョン 2.0 のオブジェクトに対してビルドされている場合は、バージョン 2.0 の HelloService がサーバーでアクティブ化されます。

サービスを構成するときに、クライアント側でアクティブ化される型のバージョン番号を指定することはできません。また、サーバー側でアクティブ化される型に対して指定したバージョン情報は、クライアント側でアクティブ化されるオブジェクトには影響しません。サーバー側でアクティブ化される型とクライアント側でアクティブ化される型の両方が同じアセンブリ内にある場合も同様です。

たとえば、クライアント側でアクティブ化される型とサーバー側でアクティブ化される型が同じアセンブリ内にあり、client1 をバージョン 1.0 に対してビルドし、client2 をバージョン 2.0 に対してビルドするとします。サーバー側でアクティブ化されるオブジェクトにバージョン情報が指定されていない場合、client1 は、サーバー側でアクティブ化されるオブジェクトについてはバージョン 2.0 を、クライアント側でアクティブ化されるオブジェクトについてはバージョン 1.0 を受け取ります。Client2 は、well-known 型と activated 型の両方についてバージョン 2.0 のオブジェクトを受け取ります。

well-known オブジェクトについてバージョン 1.0 のアセンブリを使用するようにサービスを構成すると、well-known オブジェクトについてはどちらのクライアントもバージョン 1.0 を受け取りますが、activated 型については、client1 はバージョン 1.0 を受け取り、client 2 はバージョン 2.0 を受け取ります。

クライアントに対してアクティブ化されるバージョンは構成できません。クライアントをビルドしたときに使用したバージョンが常に使用されます。

オブジェクト参照

サーバー側でアクティブ化される型とクライアント側でアクティブ化される型に適用されるのと同じ規則はオブジェクト参照にも適用されます。たとえば、クライアント側でアクティブ化される型のプロキシが、あるクライアントから別のクライアントに、またはクライアントからサーバーにパラメーターとして渡されると、オブジェクト参照に埋め込まれたバージョン情報も一緒に渡されます。受信側がオブジェクト参照から生成されたプロキシでメソッドを呼び出そうとすると、オブジェクト参照に埋め込まれたバージョンは、クライアントのビルドで使用されたバージョンよりも優先されます。サーバー側でアクティブ化されるオブジェクトの場合、使用されるバージョンはサーバーによって決定され、オブジェクト参照をパラメーターとして受け取るするすべてのクライアントは、サービスが構成されたときに指定されたバージョンと通信します。バージョン管理を行わない場合、サーバーでは最新のバージョンがアクティブ化されます。

値渡しのマーシャリング オブジェクト

値渡しのマーシャリング (MBV: Marshal-By-Value) オブジェクトをアプリケーション ドメイン間で渡す場合、使用されているフォーマッタによってバージョン情報を含めるかどうかが決まります。BinaryFormatter オブジェクトは常にバージョンを含みますが、SoapFormatter オブジェクトはバージョン情報を無視します。このオプションは、両方のフォーマッタに対して有効または無効にできます。たとえば、次の行が構成ファイルに追加された場合、SoapFormatter は、オブジェクトをシリアル化するときにバージョン情報を追加します。

<formatter ref="soap" includeVersions="true" />

参照

概念

リモート アプリケーションの構成
クライアント アクティベーション
サーバー アクティベーション

その他のリソース

.NET Framework リモート処理の概要