Compartilhar via


Compatibilidade com versões anteriores e interoperabilidade do Sync Framework

Diferentes versões do Sync Framework podem ser instaladas lado a lado em um computador, de forma que os aplicativos e provedores escritos para uma versão específica do Sync Framework continuem funcionando como esperado, até mesmo quando versões mais novas do Sync Framework forem lançadas. No entanto, como a versão do Sync Framework que um provedor ou aplicativo de sincronização usa pode ser alterada independentemente de outros componentes, verifique se as réplicas em uma comunidade de sincronização podem continuar sincronizando entre si. Por exemplo, quando o aplicativo de sincronização for atualizado para usar o Sync Framework 2.1, mas um dos provedores continuar a usar o Sync Framework 1.0. 

Considere estas área de compatibilidade:

  • Compatibilidade de interface. Por exemplo, um aplicativo de sincronização usa o Sync Framework 2.1 e se conecta a provedores no mesmo processo. Um dos provedores usa o Sync Framework 1.0. A compatibilidade de interface pode ser alcançada no código gerenciado, usando o redirecionamento de assembly. As interfaces são incompatíveis em código não gerenciado.

  • Consulte Compatibilidade de metadados de banco de dados. O formato de metadados usado pelos provedores de banco de dados foi alterado no Sync Framework 2.1. Um provedor de banco de dados do Sync Framework 2.1 SQL Server pode sincronizar bancos de dados que usam o formato de metadados 2.0 ou 2.1 ou pode atualizar um banco de dados para o novo formato. Um provedor de banco de dados do Sync Framework 2.1 SQL Server Compact atualiza automaticamente o banco de dados para o novo formato quando o provedor se conecta ao banco de dados. Para obter um guia de atualização da comunidade de sincronização do Sync Framework 2.0 para o Sync Framework 2.1 sem sequer perder a possibilidade de manter os bancos de dados sincronizados, consulte Atualizando a comunidade de sincronização do banco de dados.

  • Compatibilidade de metadados de provedor personalizado. Por exemplo, um aplicativo de sincronização que usa o Sync Framework 2.1 e usa provedores proxy para se conectar aos provedores personalizados que são executados em processos separados. Um provedor usa o Sync Framework 2.1 e o outro usa o Sync Framework 1.0. A compatibilidade de metadados pode ser alcançada usando serialização, quando todos os componentes usarem apenas recursos compatíveis com o componente da versão mais baixa.

Dica

O código escrito no Sync Framework 1.0 pode ser recompilado no Sync Framework 2.1 sem alteração. No entanto, para garantir a compatibilidade de metadados, deve ser especificado um nível de compatibilidade SyncFrameworkVersion1 (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V1 (para código não gerenciado) sempre que os objetos de metadados forem serializados.

Compatibilidade de interface

A compatibilidade de interface é importante quando o aplicativo de sincronização usa uma versão do Sync Framework diferente da que foi usada antes por um ou ambos os provedores.

Quando os componentes de sincronização são executados no mesmo processo, as interfaces devem ser compatíveis. A tabela a seguir lista como os componentes que têm versões diferentes podem ser usados em conjunto quando são executados no mesmo processo.

Componentes

Código gerenciado

Código não gerenciado

O aplicativo usa o Sync Framework 1.0, um provedor usa o Sync Framework 1.0 e o outro provedor usa o Sync Framework 2.1.

Quando o redirecionamento de assembly não for usado, o Sync Framework 1.0 será usado pelo aplicativo e InvalidCastException será gerado quando o provedor 2.1 for usado.

Quando o redirecionamento de assembly é usado, o Sync Framework 2.1 é usado por todos os componentes. Os componentes do Sync Framework são compatíveis com versões anteriores. A sincronização funciona corretamente.

O Sync Framework 1.0 é usado pelo aplicativo e E_NOINTERFACE é retornado quando o provedor é usado.

O aplicativo usa o Sync Framework 2.1, um provedor usa o Sync Framework 1.0 e o outro provedor usa o Sync Framework 2.1.

O Sync Framework 2.1 é usado pelo aplicativo e o redirecionamento de assembly é usado para instanciar objetos da versão 2.1 para o provedor 1.0. Os componentes do Sync Framework são compatíveis com versões anteriores. A sincronização funciona corretamente.

O Sync Framework 2.1 é usado pelo aplicativo e E_NOINTERFACE é retornado quando o provedor é usado.

O aplicativo e os provedores de banco de dados usam o Sync Framework 2.0 e os bancos de dados foram atualizados para o formato de metadados 2.1.

Quando o redirecionamento de assembly é usado, o Sync Framework 2.1 é utilizado por todos os componentes. Como as interfaces do provedor de banco de dados são compatíveis com versões anteriores, o aplicativo pode usá-las sem ser recompilado. Os provedores usam o novo formato de metadados nos bancos de dados atualizados e a sincronização funciona corretamente.

Os provedores de bancos de dados somente estão disponíveis em código gerenciado.

Redirecionando a versão de assemblies do Sync Framework usada por um provedor

Quando um aplicativo e os provedores aos quais ele se conecta são escritos em código gerenciado, o redirecionamento de assembly pode ser usado para garantir que uma versão específica dos assemblies do Sync Framework seja utilizada por todos os componentes que o aplicativo carrega. Isso é útil quando um aplicativo usa o Sync Framework 2.1 e um dos provedores que ele carrega usa o Sync Framework 1.0, pois o comportamento padrão é para o provedor 1.0 usar os assemblies do Sync Framework 1.0. Com isso, o aplicativo lança InvalidCastException quando o provedor é carregado.

Para usar o redirecionamento de assembly, inclua um arquivo de configuração de aplicativo (AppName.exe.config) na mesma pasta do executável do aplicativo gerenciado. O arquivo de configuração de aplicativo especifica que qualquer componente que use os assemblies do Sync Framework 1.0 será redirecionado para usar os assemblies do Sync Framework 2.1. Lembre-se de que os componentes do provedor de banco de dados têm uma versão a mais do que outros componentes do Sync Framework. Portanto, no Sync Framework 2.1 os assemblies do provedor de banco de dados têm uma versão 3.1. O exemplo a seguir mostra como deve ser um arquivo AppName.exe.config para um projeto que sincroniza os bancos de dados do SQL Server e do 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>

Compatibilidade de metadados de banco de dados

O formato de metadados usado pelos provedores de banco de dados foi alterado no Sync Framework 2.1. Como o Sync Framework 2.1 pode operar no modo de compatibilidade com versões anteriores, é possível atualizar a comunidade sem sequer perder a possibilidade de manter os bancos de dados sincronizados. Para obter mais informações, consulte Atualizando a comunidade de sincronização do banco de dados.

Para bancos de dados do SQL Server, quando a classe SqlSyncProvider é usada para executar sincronização, SqlSyncProvider detecta se o banco de dados utiliza o formato de dados 2.0 ou 2.1. Quando um banco de dados usa o formato 2.0, o provedor opera no modo de compatibilidade com versões anteriores para que a sincronização continue funcionando corretamente. Fique atento, pois as operações diferentes da sincronização, como o provisionamento, geram DbVersionException quando a versão do banco de dados não corresponde à versão do componente do Sync Framework. Quando estiver pronto para atualizar o formato de metadados do banco de dados, você poderá usar a classe SqlSyncStoreMetadataUpgrade para executar a atualização.

Para bancos de dados do SQL Server Compact, todos os componentes do Sync Framework detectam a versão do banco de dados e atualizam automaticamente o formato de metadados quando a versão não corresponde à versão do componente do Sync Framework. Um banco de dados do SQL Server Compact também pode ser atualizado explicitamente com o uso da classe SqlCeSyncStoreMetadataUpgrade.

Dica

Após a atualização de um banco de dados para o formato de metadados 2.1, ele não poderá mais ser atualizado por um provedor que use uma versão anterior do Sync Framework. Quando SqlSyncProvider do Sync Framework 2.0 tenta sincronizar um banco de dados no formato 2.1, o Sync Framework gera SqlException com a seguinte mensagem: Nome de coluna inválido 'nome_do_escopo'. Quando SqlCeSyncProvider do Sync Framework 2.0 tenta sincronizar um banco de dados no formato 2.1, o Sync Framework gera DbSyncException com a seguinte mensagem: Erro ao inicializar adaptadores para o escopo '<scope name>'. Verifique se o nome do escopo especificado no provedor existe na tabela de metadados do escopo e se as tabelas base corretas foram especificadas para esse escopo.

Nas duas situações, você deve atualizar para o Sync Framework 2.1 e recompilar o aplicativo ou usar o redirecionamento de associação para carregar componentes do Sync Framework 2.1, pois não é possível desfazer a atualização do formato de metadados.

Como os componentes do Sync Framework 2.0 não podem operar em um banco de dados que use o formato de metadados 2.1, não se esqueça de atualizar os bancos de dados e os componentes na ordem correta. Para obter mais informações, consulte Atualizando a comunidade de sincronização do banco de dados.

Compatibilidade de metadados

Os componentes de sincronização de diferentes versões podem trocar metadados entre si se os metadados que eles compartilham são do mesmo nível de compatibilidade. O Sync Framework define a enumeração CompatibilityLevel (para código gerenciado) e a enumeração SYNC_SERIALIZATION_VERSION (para código não gerenciado) para indicar a versão dos metadados contidos nos componentes de sincronização. Alguns cenários comuns são:

  • O aplicativo usa o Sync Framework 2.1 e se conecta a dois provedores usando os provedores proxy que foram criados usando o Sync Framework 2.1. Um provedor remoto usa o Sync Framework 1.0 e o outro provedor usa o Sync Framework 2.1. Nenhum provedor usa o aplicador de alterações do Sync Framework. A sincronização pode ser executada contanto que o provedor 2.1 não use nenhum recurso incompatível com o provedor 1.0. O provedor proxy troca metadados com o provedor 1.0 usando serialização e um nível de compatibilidade SyncFrameworkVersion1 (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V1 (para código não gerenciado). Lembre-se de que, nesse caso, se qualquer provedor usar o aplicador de alterações do Sync Framework, haverá uma falha na sincronização.

  • O aplicativo e os dois provedores usam o Sync Framework 2.1. Um provedor é desenvolvido para funcionar com os componentes de sincronização do sistema operacional Windows 7 e o outro é criado usando o Sync Framework 2.1. A sincronização pode ser executada contanto que o provedor 2.1 use apenas recursos compatíveis com os componentes de sincronização do sistema operacional Windows 7. Nesse caso, o nível de compatibilidade dos objetos de metadados é especificado como WindowsSync (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V2 (para código não gerenciado). Se o provedor 2.1 usar um recurso de uma versão posterior, como filtros personalizados, haverá uma falha na sincronização.

Código gerenciado As classes de metadados que dão suporte às versões de serialização são ChangeBatchBase, SyncKnowledge e as classes derivadas dessas classes, como ChangeBatch e ForgottenKnowledge. Por exemplo, um provedor serializa um objeto SyncKnowledge no formato 1.0 definindo a propriedade CompatibilityLevel como SyncFrameworkVersion1 e chamando Serialize. Se o objeto contiver elementos que não podem ser serializados no formato 1.0, InvalidKnowledgeVersionException será lançado quando a propriedade CompatibilityLevel for definida.

Código não gerenciado As interfaces de metadados que dão suporte às versões de serialização são ISyncKnowledge, ISyncChangeBatchBase2 e as interfaces relacionadas ou derivadas, como IForgottenKnowledge e ISyncChangeBatch. Por exemplo, um provedor serializa um objeto ISyncKnowledge2 no formato 1.0 especificando uma versão de serialização SYNC_SERIALIZATION_VERSION_V1 para o método ISyncKnowledge2::SerializeWithOptions. Se o objeto contiver elementos que não podem ser serializados no formato 1.0, SYNC_E_INVALID_SERIALIZATION_VERSION será retornado.

Lembre-se de que o Sync Framework 2.1 inclui dois níveis de compatibilidade. Até mesmo quando ambos os provedores usarem o Sync Framework 2.1, não se esqueça de garantir que os metadados que eles usam sejam compatíveis, não importando se os componentes são usados no mesmo processo ou interoperam usando a serialização. 

A tabela a seguir lista os recursos do Sync Framework 2.1 que afetam o formato dos metadados e seu nível de compatibilidade, bem como alguns exemplos de classes ou métodos que são incluídos nesses recursos:

Recurso

Nível de compatibilidade

Classes ou métodos de exemplo

Filtros da unidade de alteração

WindowsSync (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V2 (para código não gerenciado)

ChangeUnitListFilterInfo (para código gerenciado), Interface IChangeUnitListFilterInfo (para código não gerenciado)

Conflitos de restrição

SyncFrameworkVersion2 (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V3 (para código não gerenciado)

RecordConstraintConflictForItem (para código gerenciado), ISaveChangeContext2::SetConstraintConflictOnChange (para código não gerenciado).

Filtros personalizados

SyncFrameworkVersion2 (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V3 (para código não gerenciado)

CustomFilterInfo (para código gerenciado), Interface ICustomFilterInfo (para código não gerenciado)

Um objeto de conhecimento possui um nível de compatibilidade mínimo que corresponde aos recursos de conhecimento usados. O nível de compatibilidade usado para serializar um objeto de conhecimento não pode ser menor que o nível de compatibilidade mínimo. Em geral, um objeto de conhecimento é inicializado para ter um nível de compatibilidade mínimo de SyncFrameworkVersion1 (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V1 (para código não gerenciado). Quando um recurso usado requer um nível de compatibilidade mínimo maior, esse nível é aumentado. Por exemplo, um marcador é adicionado a um objeto de conhecimento para dar suporte à filtragem personalizada. O nível de compatibilidade mínimo do objeto de conhecimento é aumentado para SyncFrameworkVersion2 (para código gerenciado) ou SYNC_SERIALIZATION_VERSION_V3 (para código não gerenciado). Haverá falha nas tentativas de serializar um objeto de conhecimento para um nível mais baixo, assim como nas tentativas de usar o objeto de conhecimento junto com um provedor desenvolvido para funcionar apenas com um nível de compatibilidade mais baixo.

Compatibilidade do serviço de armazenamento de metadados

O Sync Framework fornece vários mecanismos para permitir que componentes de versões diferentes interoperem com metadados que são armazenados usando o serviço de armazenamento de metadados. Para obter mais informações, consulte Acessando metadados em componentes com versões diferentes e Atualizando a versão do repositório de metadados.

Consulte também

Outros recursos

Instalação, redistribuição e compatibilidade de versão