Обратная совместимость и взаимодействие платформы Sync Framework

На компьютере можно параллельно устанавливать разные версии Sync Framework, чтобы приложения и поставщики, которые созданы для работы с определенной версией Sync Framework, продолжали работать ожидаемым образом даже в случае выхода новых версий Sync Framework. Однако, поскольку версия платформы Sync Framework, используемая приложением или поставщиком синхронизации, может изменяться независимо от других компонентов, важно гарантировать возможность синхронизации реплик в сообществе синхронизации. Например, если приложение синхронизации обновляется, чтобы использовать платформу Sync Framework 2.1, но один из поставщиков продолжает использовать платформу Sync Framework 1.0. 

Рассмотрим эти две области совместимости.

  • Совместимость интерфейсов. Например, приложение синхронизации, использующее платформу Sync Framework 2.1, выполняет соединение с поставщиками в том же процессе. Один из поставщиков использует платформу Sync Framework 1.0. Совместимость интерфейсов может быть достигнута в управляемом коде с помощью перенаправления сборок. Интерфейсы в неуправляемом коде несовместимы.

  • Совместимость метаданных базы данных. Формат метаданных, используемый этими поставщиками баз данных, изменился в версии Sync Framework 2.1. Поставщик базы данных Sync Framework 2.1 SQL Server может как синхронизировать базы данных, использующие формат метаданных 2.0 или 2.1, так и обновить базу данных до нового формата. Поставщик баз данных Sync Framework 2.1 SQL Server Compact автоматически обновляет базу данных до нового формата при подключении поставщика к базе данных. Руководство по обновлению сообщества синхронизации с версии Sync Framework 2.0 до версии Sync Framework 2.1 без потери возможности синхронизации баз данных см. в разделе Обновление сообщества синхронизации баз данных.

  • Совместимость метаданных настраиваемого поставщика. Например, приложение синхронизации использует Sync Framework 2.1 и прокси-поставщика для подключения к настраиваемым поставщикам, запущенным в отдельных процессах. Один из поставщиков использует платформу Sync Framework 2.1, а второй — Sync Framework 1.0. Совместимости метаданных можно достичь с помощью сериализации, когда все компоненты используют одни и те же функции, совместимые по наименьшему номеру версии.

Примечание

Код, написанный для платформы Sync Framework 1.0, может быть без изменений скомпилирован для платформы Sync Framework 2.1. Однако, чтобы гарантировать совместимость метаданных, при сериализации объектов метаданных должен быть указан уровень совместимости SyncFrameworkVersion1 (для управляемого кода) или SYNC_SERIALIZATION_VERSION_V1 (для неуправляемого кода).

Совместимость интерфейсов

Совместимость интерфейсов важна, если приложение синхронизации использует версию Sync Framework, отличную от версии, используемой одним из поставщиков (или обоими поставщиками).

Если компоненты синхронизации выполняются в одном процессе, то интерфейсы должны быть совместимы. В следующей таблице показано, как можно использовать компоненты, имеющие различные версии, если такие компоненты выполняются в одном процессе.

Компоненты

Управляемый код

Неуправляемый код

Приложение использует Sync Framework 1.0, один поставщик использует Sync Framework 1.0, а другой поставщик — Sync Framework 2.1.

Если перенаправление сборок не используется, то приложение использует платформу Sync Framework 1.0, а при вызове поставщика версии 2.1 вызывается исключение InvalidCastException.

Когда используется перенаправление сборок, Sync Framework 2.1 используется всеми компонентами. Компоненты Sync Framework обратно совместимы. Синхронизация работает правильно.

Приложение использует платформу Sync Framework 1.0, и, если используется этот поставщик, возвращается код E_NOINTERFACE.

Приложение использует платформу Sync Framework 2.1, один поставщик использует платформу Sync Framework 1.0, а другой — платформу Sync Framework 2.1.

Приложением используется платформа Sync Framework 2.1, а для создания экземпляров объектов версии 2.1 для поставщика 1.0 используется перенаправление сборок. Компоненты Sync Framework имеют обратную совместимость, поэтому функции синхронизации работают правильно. Синхронизация работает правильно.

Приложение использует платформу Sync Framework 2.1, и при использовании этого поставщика возвращается код E_NOINTERFACE.

Приложение и поставщики базы данных используют Sync Framework 2.0, и базы данных обновлены до формата метаданных 2.1.

Когда используется перенаправление сборок, Sync Framework 2.1 используется всеми компонентами. Компоненты обратно совместимы и поэтому будут работать правильно. Поскольку интерфейсы поставщика базы данных обратно совместимы, приложение может использовать их без перекомпиляции. Поставщики используют новый формат метаданных в обновленных базах данных, и поэтому синхронизация работает правильно.

Поставщики баз данных доступны только в управляемом коде.

Перенаправление версии сборок платформы Sync Framework, используемых поставщиком

Если приложение и поставщики, к которым оно подключается, написаны в управляемом коде, можно применять перенаправление сборок, чтобы все компоненты, загружаемые приложением, использовали одну версию сборок платформы Sync Framework. Это полезно, когда приложение использует версию Sync Framework 2.1, а один из поставщиков, загружаемых приложением, — версию Sync Framework 1.0, поскольку по умолчанию поставщик версии 1.0 использует сборки версии Sync Framework 1.0. В результате при загрузке такого поставщика приложение вызывает исключение InvalidCastException.

Чтобы задействовать перенаправление сборок, поместите файл конфигурации приложения (AppName.exe.config) в ту же папку, где находится исполняемый файл управляемого приложения. В файле конфигурации приложения указывается, что все компоненты, использующие сборки Sync Framework 1.0, будут перенаправляться для использования сборок Sync Framework 2.1. Помните, что компоненты поставщика базы данных имеют номер версии, на единицу больший номера версии всех остальных компонентов Sync Framework. Поэтому сборки поставщика базы данных Sync Framework 2.1 имеют номер версии 3.1. Следующий пример показывает, что может содержать в себе файл AppName.exe.config для проекта, выполняющего синхронизацию баз данных SQL Server и SQL Server Compact.

<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-2.0.0.0"
                                 newVersion="2.1.0.0" />
            </dependentAssembly>
            <dependentAssembly>
              <assemblyIdentity name="Microsoft.Synchronization.Data"
                                publicKeyToken="89845dcd8080cc91"
                                culture="neutral" />
              <bindingRedirect oldVersion="1.0.0.0-3.0.0.0"
                               newVersion="3.1.0.0" />
            </dependentAssembly>
            <dependentAssembly>
              <assemblyIdentity name="Microsoft.Synchronization.Data.SqlServer"
                                publicKeyToken="89845dcd8080cc91"
                                culture="neutral" />
              <bindingRedirect oldVersion="1.0.0.0-3.0.0.0"
                               newVersion="3.1.0.0" />
            </dependentAssembly>
            <dependentAssembly>
              <assemblyIdentity name="Microsoft.Synchronization.Data.SqlServerCe"
                                publicKeyToken="89845dcd8080cc91"
                                culture="neutral" />
              <bindingRedirect oldVersion="1.0.0.0-3.0.0.0"
                               newVersion="3.1.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Совместимость метаданных базы данных

Формат метаданных, используемый этими поставщиками баз данных, изменился в версии Sync Framework 2.1. Поскольку платформа Sync Framework 2.1 может работать в режиме обратной совместимости, сообщество можно обновить без потери возможности синхронизации баз данных. Дополнительные сведения см. в разделе Обновление сообщества синхронизации баз данных.

Если для выполнения синхронизации баз данных SQL Server используется класс SqlSyncProvider, то SqlSyncProvider определяет, какой формат метаданных использует база данных — 2.0 или 2.1. Если база данных использует формат 2.0, то поставщик работает в режиме обратной совместимости, и поэтому синхронизация будет по-прежнему выполняться правильно. Учитывайте, что все операции, кроме синхронизации, например провизионирование, будут вызывать исключение DbVersionException, если версия базы данных не совпадает с версией компонента Sync Framework. Выполнить обновление формата метаданных в базе данных можно с помощью класса SqlSyncStoreMetadataUpgrade.

Для баз данных SQL Server Compact все компоненты Sync Framework определяют версию базы данных и автоматически обновляют формат метаданных, если их версия не совпадает с версией компонента Sync Framework. Базу данных SQL Server Compact можно также явным образом обновить с помощью классаSqlCeSyncStoreMetadataUpgrade.

Примечание

После того как формат метаданных в базе данных обновлен до версии 2.1, ее синхронизация поставщиками версии ранее Sync Framework будет невозможна. Если SqlSyncProvider из Sync Framework 2.0 попытается синхронизировать базу данных в формате 2.1, Sync Framework сформирует исключение SqlException с сообщением «Недопустимое имя столбца 'scope_name'». Если SqlCeSyncProvider из Sync Framework 2.0 попытается синхронизировать базу данных в формате 2.1, то Sync Framework сформирует исключение DbSyncException с сообщением «Возникла ошибка при инициализации адаптеров для области '<scope name>'». Убедитесь, что имя области, указанное в поставщике, существует в таблице метаданных областей и для этой области правильно указаны базовые таблицы.

В обоих случаях необходимо обновление до Sync Framework 2.1 и либо перекомпиляция приложения, либо использование перенаправления привязок для загрузки компонентов Sync Framework 2.1, поскольку отмена обновления формата метаданных невозможна.

Поскольку компоненты Sync Framework 2.0 не могут работать с базой данных, в которой используется формат метаданных 2.1, выполнять обновление базы данных и компонентов нужно в правильном порядке. Дополнительные сведения см. в разделе Обновление сообщества синхронизации баз данных.

Совместимость метаданных

Компоненты синхронизации различных версий могут обмениваться метаданными, если их общие метаданные имеют одинаковый уровень совместимости. В платформе Sync Framework определено перечисление CompatibilityLevel (для управляемого кода) или SYNC_SERIALIZATION_VERSION (для неуправляемого кода), указывающее версию метаданных, содержащихся в компонентах синхронизации. Ниже приведены несколько типичных сценариев.

  • Приложение использует Sync Framework 2.1 и соединяется с двумя поставщиками через поставщики-посредники, построенные с использованием платформы Sync Framework 2.1. Один из удаленных поставщиков использует платформу Sync Framework 1.0, а второй — Sync Framework 2.1. Ни один из поставщиков не использует объект применения изменений Sync Framework. Синхронизация может быть выполнена, если поставщик для версии 2.1 не использует функции, которые несовместимы с поставщиком для версии 1.0. Поставщик-посредник обменивается метаданными с поставщиком для версии 1.0, используя сериализацию с уровнем совместимости SyncFrameworkVersion1 (для управляемого кода) или SYNC_SERIALIZATION_VERSION_V1 (для неуправляемого кода). В этом случае, если какой-либо из поставщиков использует объект применения изменений Sync Framework, то синхронизация завершится ошибкой.

  • Приложение и оба поставщика используют платформу Sync Framework 2.1. Один из поставщиков работает с компонентами синхронизации операционной системы Windows 7, а второй построен с помощью платформы Sync Framework 2.1. Синхронизация может быть выполнена, если поставщик для версии 2.1 использует только те компоненты, которые совместимы с компонентами синхронизации операционной системы Windows 7. В этом случае необходимо указать уровень совместимости объектов метаданных WindowsSync (для управляемого кода) или SYNC_SERIALIZATION_VERSION_V2 (для неуправляемого кода). Если поставщик для версии 2.1 использует функцию более поздней версии (например, пользовательские фильтры), то синхронизация завершится ошибкой.

Управляемый код. Классы метаданных, поддерживающие версии сериализации — ChangeBatchBase, SyncKnowledge, а также их наследники, например ChangeBatch и ForgottenKnowledge. К примеру, поставщик выполняет сериализацию объекта SyncKnowledge в формат версии 1.0, задавая для свойства CompatibilityLevel значение SyncFrameworkVersion1 и вызывая метод Serialize. Если объект содержит элементы, которые невозможно сериализовать в формате версии 1.0, то при установке свойства CompatibilityLevel вызывается исключение InvalidKnowledgeVersionException.

Неуправляемый код. Интерфейсы метаданных, поддерживающие версии сериализации — ISyncKnowledge, ISyncChangeBatchBase2, а также унаследованные или связанные интерфейсы, например IForgottenKnowledge и ISyncChangeBatch. К примеру, поставщик сериализует объект ISyncKnowledge2 в формат версии 1.0, указывая версию сериализации SYNC_SERIALIZATION_VERSION_V1 при вызове метода ISyncKnowledge2::SerializeWithOptions. Если объект содержит элементы, которые невозможно сериализовать в формате версии 1.0, возвращается значение SYNC_E_INVALID_SERIALIZATION_VERSION.

Следует помнить, что платформа Sync Framework 2.1 предусматривает два уровня совместимости. Даже в случае, когда оба поставщика используют Sync Framework 2.1, необходимо обеспечить совместимость метаданных, если оба компонента используются в одном процессе или взаимодействие обеспечивается путем сериализации. 

В следующей таблице перечислены функции Sync Framework 2.1, которые влияют на формат метаданных, соответствующие уровни совместимости и примеры классов или методов, входящих в каждую функцию.

Функция

Уровень совместимости

Примеры классов или методов

Фильтры базовых единиц

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 предоставляет несколько механизмов, позволяющих компонентам различных версий работать с метаданными, хранящимися с использованием службы хранилища метаданных. Дополнительные сведения см. в разделах Доступ к метаданным из компонентов с различными версиями и Обновление версии хранилища метаданных.

См. также

Другие ресурсы

Установка, распространение и совместимость версий