É uma propriedade em tempo de compilação!
Uma das coisas mais importantes a saber é que "Versão específica" é uma propriedade que entra em vigor no tempo de compilação e não no tempo de execução.
Sobre o que é tudo isso?
Quando um projeto é construído, as referências de montagem do projeto precisam ser resolvidas para encontrar os assemblies físicos que o sistema de construção deve usar. Se a verificação "Versão específica" for executada (consulte a seção "Quando a" Versão específica "é marcada?"), Ela afeta o resultado do processo de resolução da montagem:
- O sistema de construção localiza um conjunto físico que ele pode potencialmente usar
- O sistema de compilação compara a versão da montagem física com a versão da montagem armazenada no arquivo .csproj para a referência de montagem
- Se as duas versões da montagem forem exatamente iguais, o processo de resolução será bem-sucedido e a montagem física encontrada será usada para a compilação
- Se as duas versões da montagem não corresponderem, a montagem física será descartada e o processo de resolução continuará localizando a próxima montagem em potencial
- Se não for possível localizar mais assemblies físicos em potencial, o processo de resolução falhará. Isso resulta em um aviso do compilador (aviso MSB3245) que informa que a referência não pôde ser resolvida.
- Curiosamente, a construção continua! Se o código não tiver referências reais ao assembly, a compilação será bem-sucedida (com o aviso mencionado anteriormente). Se o código tiver referências, a compilação falhará com um erro que parece que o código estava usando tipos ou espaços de nomes desconhecidos. A única indicação do motivo pelo qual a compilação realmente falhou é o aviso MSB3245.
Ordem na qual as montagens são resolvidas
A ordem na qual o processo de resolução da montagem localiza as montagens em potencial parece ser a seguinte:
- A montagem referenciada pelo
<HintPath>
elemento no arquivo .csproj
- O caminho de saída do projeto
- O GAC
Observe que, se existirem várias versões do assembly no GAC, o processo de resolução primeiro tenta resolver o assembly com a versão mais alta. Isso é importante apenas se a verificação "Versão específica" não for feita.
Quando a "Versão específica" está marcada?
O Visual Studio baseia sua decisão de executar a verificação "Versão específica" em duas informações encontradas no arquivo .csproj:
- A presença ou ausência do
<SpecificVersion>
elemento e seu valor (se houver)
- A presença ou ausência de informações de versão na referência de montagem
É assim que uma referência típica de montagem com informações de versão se parece:
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>
E é assim que a referência de montagem se parece sem informações de versão:
<Reference Include="Foo">
[...]
A tabela a seguir mostra quando a verificação "Versão específica" é executada e quando não é.
| Version information
| Present Not present
----------------------------+------------------------------
<SpecificVersion> |
- Present, has value True | Yes (1) Yes (check always fails) (2)
- Present, has value False | No (3) No (4)
- Not present | Yes (5) No (6)
O surpreendente aqui é que nenhuma verificação será realizada se as <SpecificVersion>
informações de versão e de versão estiverem ausentes (caso 6). Eu esperava que a verificação fosse realizada e sempre falhasse (igual ao caso 2) porque, no meu entendimento, a ausência de <SpecificVersion>
implica o valor padrão "True". Isso pode ser uma peculiaridade do Visual Studio 2010, onde eu fiz meus testes.
Ao examinar as propriedades de uma referência de montagem na interface do usuário do Visual Studio (selecione a referência e pressione F4), o valor que você vê para a propriedade "Versão específica" informa se o Visual Studio executará ou não a "Versão específica" Verifica. No caso 6, a interface do usuário mostrará "True", embora o <SpecificVersion>
elemento não esteja presente no arquivo .csproj.
Efeitos colaterais em "Copiar local"
Se a propriedade "Copiar local" estiver definida como "Verdadeiro", mas o processo de resolução da montagem falhar devido à verificação "Versão específica", nenhuma montagem será copiada.
Material de referência