Sync Framework 向后兼容性和互操作性

Sync Framework 的不同版本可以在计算机上并行安装,以便为特定版本的 Sync Framework 编写的应用程序和提供程序可以继续发挥预期的作用,甚至在发布 Sync Framework 的新版本时也一样。但是,因为同步应用程序或提供程序使用的 Sync Framework 版本可能独立于其他组件发生变化,所以,一定要确保同步社区中的副本可以继续彼此同步。例如,当将同步应用程序升级到使用 Sync Framework 2.0,但其中一个提供程序继续使用 Sync Framework 1.0 时。

需要考虑兼容性的以下两个主要方面:

  • 接口兼容性。例如,一个同步应用程序使用 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 构建)连接到两个提供程序。一个远程提供程序使用 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 提供程序使用来自更高版本的功能(如自定义筛选器),则同步将失败。

托管代码 支持序列化版本的元数据类为 ChangeBatchBaseSyncKnowledge 和派生自这些类的类(如 ChangeBatchForgottenKnowledge)。例如,提供程序通过将 CompatibilityLevel 属性设置为 SyncFrameworkVersion1 并调用 Serialize,将 SyncKnowledge 对象序列化为 1.0 格式。如果该对象包含无法序列化为 1.0 格式的元素,则在设置 CompatibilityLevel 属性时将引发 InvalidKnowledgeVersionException

非托管代码 支持序列化版本的元数据接口为 ISyncKnowledgeISyncChangeBatchBase2 和派生的或相关的接口,例如,IForgottenKnowledgeISyncChangeBatch。例如,提供程序通过将序列化版本 SYNC_SERIALIZATION_VERSION_V1 指定为 ISyncKnowledge2::SerializeWithOptions 方法,将 ISyncKnowledge2 对象序列化为 1.0 格式。如果该对象包含无法序列化为 1.0 格式的元素,则返回 SYNC_E_INVALID_SERIALIZATION_VERSION

请注意,Sync Framework 2.0 包括两个兼容性级别。即使两个提供程序都使用 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(对于非托管代码)。将知识对象序列化为更低级别的尝试将失败,因为这会尝试将知识对象用于设计为仅使用更低兼容性级别的提供程序。

元数据存储服务兼容性

Sync Framework 提供若干机制来允许不同版本的组件与通过使用元数据存储服务存储的元数据互操作。有关更多信息,请参见访问来自不同版本的组件的元数据升级元数据存储区版本

请参阅

概念

安装、重新分发和版本兼容性