Sync Framework の旧バージョンとの互換性と相互運用性
異なる複数のバージョンの Sync Framework を 1 台のコンピューターにサイド バイ サイドでインストールできるので、Sync Framework の新バージョンがリリースされた後も、既存バージョンの Sync Framework 用に作成されたアプリケーションやプロバイダーを引き続き使用できます。ただし、同期アプリケーションまたはプロバイダーが使用する Sync Framework のバージョンと、その他のコンポーネントとが別々に変更される可能性もあるので、同期コミュニティ内のレプリカどうしが確実に同期されるように考慮する必要があります。たとえば、同期アプリケーションが Sync Framework 2.0 を使用するようにアップグレードされた後に、いずれかのプロバイダーが引き続き Sync Framework 1.0 を使用しているケースが考えられます。
考慮する必要のある互換性は、大きく次の 2 種類に分けることができます。
インターフェイスの互換性: たとえば、Sync Framework 2.0 を使用する同期アプリケーションが、同じプロセスのプロバイダーに接続しているとします。そのいずれかのプロバイダーで Sync Framework 1.0 を使用しています。マネージ コードでは、アセンブリのリダイレクトを使用することでインターフェイスの互換性を確保できます。アンマネージ コードでは、インターフェイスの互換性が確保されません。
メタデータの互換性: たとえば、Sync Framework 2.0 を使用する同期アプリケーションが、プロキシ プロバイダーを使用して、個別のプロセスで実行されるプロバイダーに接続しているとします。その一方のプロバイダーでは Sync Framework 2.0 を使用し、もう一方のプロバイダーでは Sync Framework 1.0 を使用しています。この場合、シリアル化を使用することでメタデータの互換性を確保できます。ただし、すべてのコンポーネントで、バージョンが最も低いコンポーネントと互換性がある機能だけを使用している必要があります。
注意
Sync Framework 1.0 を対象に作成されているコードは、変更を加えることなく、Sync Framework 2.0 用に再コンパイルできます。ただし、メタデータ オブジェクトがシリアル化されている場合にメタデータの互換性を確保するには、互換性レベルに SyncFrameworkVersion1 (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V1 (アンマネージ コードの場合) を指定する必要があります。
インターフェイスの互換性
同期アプリケーションとプロバイダーがそれぞれ異なるバージョンの Sync Framework を使用している場合は、インターフェイスの互換性が重要となります。
複数の同期コンポーネントが同じプロセスで動作する場合、インターフェイスの互換性は必須です。次の表は、使用バージョンの異なる各コンポーネントを同じプロセスで実行するとどうなるかを示しています。
コンポーネント | マネージ コード | アンマネージ コード |
---|---|---|
アプリケーションは Sync Framework 1.0 を使用。一方のプロバイダーは Sync Framework 1.0、もう一方のプロバイダーは Sync Framework 2.0 を使用する。 |
アセンブリのリダイレクトを使用しない場合、アプリケーションでは Sync Framework 1.0 が使用されます。バージョン 2.0 のプロバイダーの使用時に InvalidCastException がスローされます。 アセンブリのリダイレクトを使用した場合、すべてのコンポーネントで Sync Framework 2.0 が使用されます。Sync Framework のコンポーネントは旧バージョンと互換性があるため、同期は正常に機能します。 |
アプリケーションでは Sync Framework 1.0 が使用されます。プロバイダーの使用時に E_NOINTERFACE が返されます。 |
アプリケーションは Sync Framework 2.0 を使用。一方のプロバイダーは Sync Framework 1.0、もう一方のプロバイダーは Sync Framework 2.0 を使用する。 |
アプリケーションでは Sync Framework 2.0 が使用されます。バージョン 1.0 のプロバイダーに関しては、アセンブリのリダイレクトを使用することにより、バージョン 2.0 のオブジェクトがインスタンス化されます。Sync Framework のコンポーネントは旧バージョンと互換性があるため、同期は正常に機能します。 |
アプリケーションでは Sync Framework 2.0 が使用されます。プロバイダーの使用時に E_NOINTERFACE が返されます。 |
プロバイダーが使用する Sync Framework アセンブリのバージョンをリダイレクトする
アプリケーションとその接続先プロバイダーがマネージ コードで記述されている場合、アセンブリをリダイレクトすることにより、そのアプリケーションが読み込むすべてのコンポーネントの Sync Framework アセンブリを特定のバージョンに統一することができます。たとえば、アプリケーションが Sync Framework 2.0 を使用しており、そのアプリケーションによって読み込まれるいずれかのプロバイダーが Sync Framework 1.0 を使用している場合、この方法が効果的です。1.0 のプロバイダーに関しては Sync Framework 1.0 のアセンブリを使用するというのが既定の動作であるためです。この場合、アプリケーションは、プロバイダーの読み込み時に InvalidCastException をスローします。
アセンブリのリダイレクトを使用するには、マネージ アプリケーションのプロジェクトにアプリケーション構成 (AppName.exe.config) ファイルを追加します。この構成ファイルで、Sync Framework 1.0 のアセンブリを使用するコンポーネントはすべて、Sync Framework 2.0 のアセンブリを使用するようにリダイレクトする、という意味の指定を行います。次の例は、実際の AppName.exe.config ファイルの内容です。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Synchronization"
publicKeyToken="89845dcd8080cc91"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0-1.9.9.9"
newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
メタデータの互換性
バージョンの異なる複数の同期コンポーネント間でメタデータを交換するには、それらのコンポーネントが共有するメタデータの互換性レベルが同じでなければなりません。Sync Framework には、同期コンポーネント内に格納されているメタデータのバージョンを表す CompatibilityLevel 列挙型 (マネージ コードの場合) および SYNC_SERIALIZATION_VERSION 列挙型 (アンマネージ コードの場合) が定義されています。一般的なシナリオは以下のとおりです。
Sync Framework 2.0 を使用するアプリケーションが、Sync Framework 2.0 を使用して構築されたプロキシ プロバイダーを使用して、2 つのプロバイダーに接続しているとします。一方のリモート プロバイダーでは Sync Framework 1.0 を使用し、もう一方のプロバイダーでは Sync Framework 2.0 を使用しています。どちらのプロバイダーも Sync Framework の変更適用元は使用していません。このシナリオでは、バージョン 2.0 のプロバイダーでバージョン 1.0 のプロバイダーと互換性がない機能が使用されていない場合に限り同期を実行できます。プロキシ プロバイダーでは、シリアル化と互換性レベル SyncFrameworkVersion1 (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V1 (アンマネージ コードの場合) を使用して、バージョン 1.0 のプロバイダーとメタデータを交換します。このケースでは、いずれかのプロバイダーで Sync Framework の変更適用元を使用している場合は同期が失敗することに注意してください。
アプリケーションと両方のプロバイダーで Sync Framework 2.0 を使用しているとします。一方のプロバイダーは Windows 7 オペレーティング システムの同期コンポーネントで動作するように設計されており、もう一方は Sync Framework 2.0 を使用して構築されています。このシナリオでは、バージョン 2.0 のプロバイダーで Windows 7 オペレーティング システムの同期コンポーネントと互換性がある機能だけが使用されている場合に限り同期を実行できます。この場合、メタデータ オブジェクトの互換性レベルには、WindowsSync (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V2 (アンマネージ コードの場合) が指定されます。バージョン 2.0 のプロバイダーでそれ以降のバージョンの機能 (カスタム フィルターなど) が使用されている場合、同期は失敗します。
マネージ コード シリアル化バージョンをサポートするメタデータ クラスには、ChangeBatchBase、SyncKnowledge、およびそれらのクラスの派生クラス (ChangeBatch や ForgottenKnowledge など) があります。たとえば、プロバイダーは、CompatibilityLevel プロパティを SyncFrameworkVersion1 に設定し、Serialize を呼び出すことによって、SyncKnowledge オブジェクトを 1.0 形式にシリアル化します。オブジェクトに 1.0 形式へとシリアル化できない要素が含まれている場合、CompatibilityLevel プロパティの設定時に InvalidKnowledgeVersionException がスローされます。
アンマネージ コード シリアル化バージョンをサポートするメタデータ インターフェイスには、ISyncKnowledge、ISyncChangeBatchBase2、およびそれらの派生インターフェイスと関連インターフェイス (IForgottenKnowledge や ISyncChangeBatch など) があります。たとえば、プロバイダーは、ISyncKnowledge2::SerializeWithOptions メソッドにシリアル化バージョン SYNC_SERIALIZATION_VERSION_V1 を指定することによって、ISyncKnowledge2 オブジェクトを 1.0 形式にシリアル化します。オブジェクトに 1.0 形式へとシリアル化できない要素が含まれている場合、SYNC_E_INVALID_SERIALIZATION_VERSION が返されます。
Sync Framework 2.0 には 2 つの互換性レベルがあることに注意してください。両方のプロバイダーが Sync Framework 2.0 を使用している場合でも、それぞれのメタデータの互換性を確認する必要があります。両方のコンポーネントが同じプロセスで実行されているかどうかや、シリアル化による相互運用がなされているかどうかは関係ありません。
次の表は、メタデータの形式に影響する Sync Framework 2.0 の機能とその互換性レベル、およびその機能に含まれているクラス/メソッドの例を一覧にしたものです。
機能 | 互換性レベル | クラス/メソッドの例 |
---|---|---|
変更単位フィルター |
WindowsSync (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V2 (アンマネージ コードの場合) |
ChangeUnitListFilterInfo (マネージ コードの場合)、IChangeUnitListFilterInfo インターフェイス (アンマネージ コードの場合) |
制約の競合 |
SyncFrameworkVersion2 (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V3 (アンマネージ コードの場合) |
RecordConstraintConflictForItem (マネージ コードの場合)、ISaveChangeContext2::SetConstraintConflictOnChange (アンマネージ コードの場合) |
カスタム フィルター |
SyncFrameworkVersion2 (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V3 (アンマネージ コードの場合) |
CustomFilterInfo (マネージ コードの場合)、ICustomFilterInfo インターフェイス (アンマネージ コードの場合) |
ナレッジ オブジェクトには、使用されているナレッジ機能に対応する最低互換性レベルが設定されます。ナレッジ オブジェクトのシリアル化に使用される互換性レベルを最低互換性レベルより低くすることはできません。通常、ナレッジ オブジェクトは、最低互換性レベルが SyncFrameworkVersion1 (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V1 (アンマネージ コードの場合) になるように初期化されます。この最低互換性レベルよりも高いレベルが必要な機能が使用されている場合は、最低互換性レベルが引き上げられます。たとえば、カスタム フィルターをサポートするためにナレッジ オブジェクトにマーカーを追加した場合、ナレッジ オブジェクトの最低互換性レベルは SyncFrameworkVersion2 (マネージ コードの場合) または SYNC_SERIALIZATION_VERSION_V3 (アンマネージ コードの場合) に引き上げられます。それよりも低いレベルにこのナレッジ オブジェクトをシリアル化しようとした場合や、それよりも低い互換性レベルでのみ動作するように設計されたプロバイダーでこのナレッジ オブジェクトを使用しようとした場合、その操作は失敗します。
Metadata Storage Service の互換性
Sync Framework には、バージョンの異なるコンポーネントが、Metadata Storage Service を使って格納されているメタデータと相互運用できるようにするしくみがいくつか用意されています。詳細については、「バージョンが異なるコンポーネントのメタデータへのアクセス」および「メタデータ ストアのアップグレード」を参照してください。