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

NoteПримечание.

Код, написанный для платформы 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, и для создания экземпляров объектов версии 2.0 для поставщика 1.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. Поставщик-посредник обменивается метаданными с поставщиком для версии 1.0, используя сериализацию с уровнем совместимости SyncFrameworkVersion1 (для управляемого кода) или SYNC_SERIALIZATION_VERSION_V1 (для неуправляемого кода). В этом случае, если какой-либо из поставщиков использует объект применения изменений 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. К примеру, поставщик выполняет сериализацию объекта 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.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 предоставляет несколько механизмов, позволяющих компонентам различных версий работать с метаданными, хранящимися с использованием службы хранилища метаданных. Дополнительные сведения см. в разделах Доступ к метаданным из компонентов с различными версиями и Обновление версии хранилища метаданных.

См. также

Основные положения

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