No desenvolvimento de aplicações .NET seja ela, ASP.NET, ASP.NET MVC, Windows Library, Windows Form é possível utilizamos algumas diversas linguagens para programação. Porem é possível também definir que nosso executável ou assembly rode em plataforma 32 bits, 64 bits ou para ambas as plataformas (Any CPU).
Mais imagina-se a seguinte situação, um pouco absurda, mais possível de se ocorrer. Você é um implantador de sistemas e deverá atender a uma demanda em um cliente. Implantar o sistema e se depara com um erro ao executar o sistema que acabou de instalar com a seguinte mensagem:
System.BadImageFormatException: Could not load file or assembly '<assembly>' or one of it dependencies. An attempt was made to load programa with an incorrect format.
Alguns outros Exceptions poderão ser vistos aqui nesse artigo sobre Exceptions do .NET Framework
Esse erro ocorrer porque um assembly necessário não foi encontrado na tentativa de executar o sistema. Mais analisando o sistema, é identificado que o assembly se encontra junto ao projeto. Isso ocorre porque o assembly que tentou-se carregar está em uma plataforma diferente do sistema.
- Exemplo 1: Aplicativo compilado para 32 bits e assembly para 64 bits
- Exemplo 2: Aplicativo compilado para 64 bits e assembly para 32 bits
A solução para esses casos seria a compilação de ambos para a mesma plataforma.
No caso das aplicações ASP.NET, também ocorrem esse tipo de problema, onde se o sistema operacional for 64 bits, o Application Pooling no IIS (Internet Information Services) por padrão será 64 bits e no caso de aplicação ser compilada para 32 bits, ocorrerá o mesmo problema.
A solução para esse caso é compilar a aplicação para ambas as plataformas (Any CPU) ou para 64 bits. Outra solução seria definir o Application Pooling para rodar em modo 32 bits.
Recentemente me deparei com essa segunda situação que citei. O programador enviou um assembly em 32 bits e o IIS (Internet Information Services) do meu servidor estava com Application Pooling definido para 64 bits. Resultado, ocorreu um BadImageFormatException. A solução seria, mudar o assembly para 64 bits ou mudar o Application Pooling para 32 bits. Mais ai vem a pergunta, como ter certeza realmente para qual plataforma ela foi compilada?
Para responder a essa pergunta, basta efetuar o download do Microsoft Windows SDK for Windows 7 and .NET Framework 4. e instala-lo. No SDK conterá as ferramentas necessárias.
Inicie a instalação do SDK.
Após a instalação, abra o prompt do SDK localizado no menu Iniciar > Microsoft Windows SDK v7.1 > Windows SDK 7.1 Command Prompt e digite o comando abaixo:
CorFlags <caminh_seu_assembly_completo>
No meu caso, esse comando irá gerar o resultado abaixo:
Version : v2.0.50727 CLR Header: 2.5 PE : PE32 CorFlags : 9 ILONLY : 1 32BIT : 0 Signed : 1
Para entender o resultado, criei a tabela abaixo que explica como identificar qual a plataforma do assembly
Plataforma | PE | ILONLY | 32BIT |
---|---|---|---|
64 bits | PE32+ | 0 | 0 |
32 bits | PE32 | 0 | 1 |
32 bits / 64 bits | PE32 | 1 | 0 |
Considerando o resultado acima e seguindo a tabela abaixo, meu assembly é Any CPU, ou seja, é compilado para 32 e 64 bits.
Espero que essa dica seja útil e qualquer dúvida deixe seu comentário.
Abraço e bom estudo