Como saber se um aplicativo .NET é 32 ou 64 bits

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.

Imagem da tela de inicio do setup do SDK

Imagem da tela de inicio do setup do SDK

Imagem da Tela de informações sobre o termo da licença de uso

Tela de informações sobre o termo da licença de uso

Imagem da Tela de definição do local de instalação do SDK

Imagem da Tela de definição do local de instalação do SDK

Imagem da tela de escolha das opções de instalação

Imagem da tela de escolha das opções de instalação

Imagem da tela sobre o aviso de inicio da instalação do SDK

Imagem da tela sobre o aviso de inicio da instalação do SDK

Imagem da tela de progresso da instalação do SDK

Imagem da tela de progresso da instalação do SDK

Imagem da tela de informação da conclusão da instalação do SDK

Imagem da tela de informação da conclusão da 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>

Imagem do prompt do SDK com a execução do comando citado

Imagem do prompt do SDK com a execução do comando citado

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

2 thoughts on “Como saber se um aplicativo .NET é 32 ou 64 bits”

  1. Legal, Raphael. Bem interessante. Com certeza, uma dica valiosa. Tive um problema parecido com uma aplicação que monitora uma placa telefônica para identificação de ligações. Minha máquina é 64 e o sistema estava compilado para 32. O sistema executava, mas quando mandava iniciar o serviço de monitoramento, ele não iniciava. O detalhe é que não dava nenhuma mensagem de erro. Como o projeto foi desenvolvido aqui na empresa, depurei o fonte e detectei que era gerada uma exceção na alocação de memória para a DLL que faz a comunicação com a placa e esta exceção estava sendo despreza. Alterei a compilação para Any CPU e o problema foi resolvido, mas até identificar isto não foi fácil. Abraços.

    1. Olha só André o trabalho que você teve. Uma simples consulta nos assemblies utilizando o SDK já teria encurtado o tempo e encontrado a solução.

      Existe um outro problema que não citei que pode vir a ocorrer. Meu sistema operacional é 64 bits, minha aplicação é Any CPU e esta utilizando um assembly de terceiro que é 32 bits. O que irá acontecer? Ocorrerá erro. Qual a solução? Utilizar o assembly de terceiros em 64 bits. Porque não Any CPU? Por conta do Sistema Operacional que é 64 bits e da aplicação que é Any CPU, tudo rodará em modo 64 bits.

      Fica a dica para futuros problemas ou até mesmo para evitá-los.

Os comentários estão fechados.