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.0, mas um dos provedores continuar a usar o Sync Framework 1.0.
Há duas áreas principais de compatibilidade a serem consideradas:
Compatibilidade de interface. Por exemplo, um aplicativo de sincronização usa o Sync Framework 2.0 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 não são compatíveis em códigos não gerenciados.
Compatibilidade de metadados. Por exemplo, um aplicativo de sincronização usa o Sync Framework 2.0 e usa provedores proxy para se conectar aos provedores que são executados em processos separados. Um provedor usa o Sync Framework 2.0 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.0 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.0. |
Quando o redirecionamento de assembly não for usado, o Sync Framework 1.0 será usado pelo aplicativo e InvalidCastException será lançado quando o provedor 2.0 for usado. Quando o redirecionamento de assembly é usado, o Sync Framework 2.0 é usado por todos os componentes. Os componentes do Sync Framework são compatíveis com versões anteriores, logo 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.0, um provedor usa o Sync Framework 1.0 e o outro provedor usa o Sync Framework 2.0. |
O Sync Framework 2.0 é usado pelo aplicativo e o redirecionamento de assembly é usado para instanciar objetos da versão 2.0 para o provedor 1.0. Os componentes do Sync Framework são compatíveis com versões anteriores, logo a sincronização funciona corretamente. |
O Sync Framework 2.0 é usado pelo aplicativo e E_NOINTERFACE é retornado quando o provedor é usado. |
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 assegurar que uma versão específica dos assemblies do Sync Framework seja usada por todos os componentes que o aplicativo carrega. Isso é útil quando um aplicativo usa o Sync Framework 2.0 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) no projeto do aplicativo gerenciado, que especifica que qualquer componente que usa os assemblies do Sync Framework 1.0 será redirecionado para usar os assemblies do Sync Framework 2.0. O exemplo a seguir mostra como pode ser o arquivo 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>
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.0 e se conecta a dois provedores usando os provedores proxy que foram criados usando o Sync Framework 2.0. Um provedor remoto usa o Sync Framework 1.0 e o outro provedor usa o Sync Framework 2.0. Nenhum provedor usa o aplicador de alterações do Sync Framework. A sincronização pode ser executada contanto que o provedor 2.0 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.0. 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.0. A sincronização pode ser executada contanto que o provedor 2.0 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.0 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.0 inclui dois níveis de compatibilidade. Até mesmo quando ambos os provedores usarem o Sync Framework 2.0, preocupe-se em 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.0 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 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.