최신 버전의 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이 사용되고 어셈블리 리디렉션을 사용하여 1.0 공급자에 대해 버전 2.1 개체를 인스턴스화합니다. Sync Framework 구성 요소는 이전 버전과 호환됩니다. 동기화가 올바르게 작동합니다. |
응용 프로그램에서 Sync Framework 2.1이 사용되고 공급자가 사용되면 E_NOINTERFACE가 반환됩니다. |
이 응용 프로그램과 데이터베이스 공급자는 Sync Framework 2.0을 사용하고 데이터베이스는 2.1 메타데이터 형식으로 업그레이드되었습니다. |
어셈블리 리디렉션이 사용되는 경우 모든 구성 요소에서 Sync Framework 2.1을 사용합니다. 데이터베이스 공급자 인터페이스가 이전 버전과 호환되기 때문에 다시 컴파일하지 않고 응용 프로그램이 해당 인터페이스를 사용할 수 있습니다. 공급자는 업그레이드된 데이터베이스에서 새 메타데이터 형식을 사용하고 동기화가 올바르게 작동합니다. |
데이터베이스 공급자는 관리 코드에서만 사용할 수 있습니다. |
공급자에서 사용되는 Sync Framework 어셈블리 버전 리디렉션
연결되는 응용 프로그램 및 공급자가 관리 코드로 작성되었으면 어셈블리 리디렉션을 사용하여 특정 버전의 Sync Framework 어셈블리가 응용 프로그램에서 로드하는 모든 구성 요소에서 사용되도록 할 수 있습니다. 기본 동작이 1.0 공급자가 Sync Framework 1.0 어셈블리를 사용하는 것이므로 응용 프로그램이 Sync Framework 2.1을 사용하고 여기에서 로드되는 공급자 중 하나가 Sync Framework 1.0을 사용할 경우 이 방식이 유용합니다. 이렇게 하면 공급자가 로드될 때 응용 프로그램에서 InvalidCastException이 발생합니다.
어셈블리 리디렉션을 사용하려면 응용 프로그램 구성 파일(AppName.exe.config)을 관리되는 응용 프로그램 실행 파일이 있는 폴더와 동일한 폴더에 포함시킵니다. 응용 프로그램 구성 파일은 Sync Framework 1.0 어셈블리를 사용하는 모든 구성 요소를 리디렉션하여 Sync Framework 2.1 어셈블리를 사용하도록 지정합니다. 데이터베이스 공급자 구성 요소의 버전은 다른 Sync Framework 구성 요소의 버전보다 한 버전 앞섭니다. 따라서 Sync Framework 2.1에서 데이터베이스 공급자 어셈블리의 버전은 3.1입니다. 다음 예제에서는 SQL Server와 SQL Server Compact 데이터베이스를 동기화하는 프로젝트에 사용되는 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-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 형식을 사용하면 공급자가 이전 버전과의 호환성 모드에서 작동하기 때문에 동기화가 계속해서 올바르게 작동합니다. 프로비전과 같은 동기화가 아닌 작업은 데이터베이스의 버전이 Sync Framework 구성 요소의 버전과 일치하지 않을 경우 DbVersionException을 발생시킵니다. 데이터베이스의 메타데이터 형식을 업그레이드할 준비가 된 경우 SqlSyncStoreMetadataUpgrade 클래스를 사용하여 업그레이드를 수행할 수 있습니다.
SQL Server Compact 데이터베이스의 경우 모든 Sync Framework 구성 요소가 데이터베이스의 버전을 감지하여 해당 버전이 Sync Framework 구성 요소의 버전과 일치하지 않을 경우 자동으로 메타데이터 형식을 업그레이드합니다. SQL Server Compact 데이터베이스는 SqlCeSyncStoreMetadataUpgrade 클래스를 사용해서도 명시적으로 업그레이드할 수 있습니다.
참고
데이터베이스를 2.1 메타데이터 형식으로 업그레이드한 후에는 더 이상 이전 버전의 Sync Framework를 사용하는 공급자를 통해 동기화할 수 없습니다. Sync Framework에 있는 SqlSyncProvider에서 2.1 형식의 데이터베이스를 동기화하려고 하면 Sync Framework에서 '열 이름 'scope_name'이(가) 잘못되었습니다.'라는 메시지와 함께 SqlException을 throw합니다. Sync Framework 2.0에 있는 SqlCeSyncProvider에서 2.1 형식의 데이터베이스를 동기화하려고 하면 Sync Framework에서 '범위 '<scope name>'에 대한 어댑터를 초기화할 때 오류가 발생했습니다.'라는 메시지와 함께 DbSyncException을 throw합니다. 공급자에서 지정한 범위 이름이 범위 메타데이터 테이블에 있으며 해당 범위에 대해 올바른 기본 테이블이 지정되었는지 확인하십시오
두 경우 모두 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 공급자와 호환되지 않는 기능을 사용하지 않을 경우 동기화를 수행할 수 있습니다. 프록시 공급자가 직렬화 및 SyncFrameworkVersion1(관리 코드의 경우) 또는 SYNC_SERIALIZATION_VERSION_V1(비관리 코드의 경우)의 호환성 수준을 사용하여 1.0 공급자와 메타데이터를 교환합니다. 이러한 경우 두 공급자 중 하나가 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)입니다. 예를 들어 공급자는 CompatibilityLevel 속성을 SyncFrameworkVersion1로 설정하고 Serialize를 호출하여 SyncKnowledge 개체를 1.0 형식으로 직렬화합니다. 개체에 1.0 형식으로 직렬화할 수 없는 요소가 들어 있으면 CompatibilityLevel 속성을 설정할 때 InvalidKnowledgeVersionException이 발생됩니다.
비관리 코드 직렬화 버전을 지원하는 메타데이터 인터페이스는 ISyncKnowledge, ISyncChangeBatchBase2 그리고 IForgottenKnowledge 및 ISyncChangeBatch와 같은 파생 또는 관련 인터페이스입니다. 예를 들어 공급자가 SYNC_SERIALIZATION_VERSION_V1의 직렬화 버전을 ISyncKnowledge2::SerializeWithOptions 메서드로 지정하여 ISyncKnowledge2 개체를 1.0 형식으로 직렬화합니다. 개체에 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(비관리 코드의 경우)로 높아집니다. 낮은 수준으로 정보 개체를 직렬화하려는 경우에는 정보 개체와 낮은 호환성 수준에서만 작동하도록 디자인된 공급자를 함께 사용하려고 시도하므로 직렬화가 실패합니다.
Metadata Storage Service 호환성
Sync Framework에서는 서로 다른 버전의 구성 요소가 Metadata Storage Service를 사용하여 저장된 메타데이터와 상호 운용할 수 있는 몇 가지 메커니즘을 제공합니다. 자세한 내용은 버전이 다른 구성 요소의 메타데이터 액세스 및 메타데이터 저장소 버전 업그레이드를 참조하십시오.