|
|
|
|
|
Dicas
|
|
Visual Basic (ActiveX/Controles/DLL)
|
|
|
Título da Dica: Alguns mistérios da compatibilidade binária
|
|
|
|
Postada em 3/9/2003 por Ð@®l@n
A compatibilidade binária, necessária no momento da recompilação de componentes em especial em um sistema no qual existam muitos componentes utilizando outros componentes, pode ser um grande problema de gerenciamento.
Garantir que todos os programadores a utilizem e nunca haja uma quebra de compatibilidade ou, se houver em um componente A, por exemplo, que os componentes que usam o componente A sejam recompilados, isso já é um problema.
Mas o mecanismo da compatibilidade binária esconde alguns mistérios a mais. Os programadores sabem que para manter a compatibilidade binária é necessário que não hajam alterações na interface. Porém o Visual Basic é muito amigável com os programadores e permite que mesmo que hajam alterações em parâmetros ou inserção de novos métodos a compatibilidade binária seja mantida. Porém isso tem um custo.
Vamos imaginar um cenário. O componente A utiliza o componente B e o componente B sempre é compilado com a compatibilidade binária. Mas compilar o componente B, que já ganhou muitos novos métodos, com compatibilidade binária tem uma consequencia que muitos programadores não conhece : O ID (GUID) da interface default do component B muda. Ele mantém o ID antigo, mas passa a ter também um novo.
Imagine nesse cenário que a empresa possui um ambiente de desenvolvimento e um para homologação e que no momento os componentes estão funcionando em ambos os ambientes. Se o componente B é recompilado e reinserido no ambiente de homologação ele ganha um novo ID de interface, mas mantém o antigo. Assim sendo, o componente A que encontra-se no ambiente de homologação e que só conhece o ID de interface antigo ainda consegue acessa-lo, porém se o componente A em desenvolvimento for recompilado, seu novo executável (dll) passará a utilizar o novo ID de interface do componente B.
Imaginemos que mais uma vez o componente B foi atualizado em desenvolvimento, mas não foi passado para homologação. O componente A também foi atualizado em desenvolvimento, recompilado, e resolveu-se passa-lo para homologação. Resultado : Por ter sido recompilado, o componente A aponta para o ID de interface do componente B mais atualizado. Porém ao ser inserido no ambiente de homologação o componente A encontrará um componente B que não possui essa interface. Consequentemente teremos uma falha no relacionamento entre o componente A e o componente B.
Resumindo : Se o componente A for compilado fazendo references para uma versão mais antiga do componente B, ele pode ser perfeitamente utilizado com a versão mais nova, pois esta guarda o ID de interface antigo. Mas se o componente A for compilado com uma versão mais nova do componente B, mesmo que não utilize nenhum recurso novo ele não pode ser utilizado com uma versão mais antiga, pois guardou o ID da nova interface. E tudo isso acontece mesmo com a compatibilidade binária estando sempre marcada.
|
|
|
|
|