BadImageFormatException was unhandled

Recentemente, enquanto trabalhava com uma aplicação em Managed DirectX no .NET (num sistema de 64 bits), deparei-me com o seguinte erro:

BadImageFormatException was unhandled
BadImageFormatException was unhandled
BadImageFormatException was unhandled
is not a valid Win32 application.  (Exception from HRESULT: 0x800700C1)
- Make sure the file image is a valid managed assembly.
- Make sure you have supplied a correct file path for the assembly.
- Get General help for this exception.

Se pedirmos mais detalhes ele dá-nos a seguinte informação:

System.BadImageFormatException was unhandled
  Message=" is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)"
  Source="Something"
  StackTrace:
       at Something.Program.Main()
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()

Solução - Mudar a plataforma da solução para sistemas x86

No meu caso e do que consegui descobrir na web, isto costuma acontecer em sistemas de 64 bits (estou numa máquina com Windows Vista Business versão 64 bits). O problema é que o compilador tenta produzir código compatível com 64 bits, mas como não tem as assemblies ou bibliotecas necessárias falha com a excepção BadImageFormatException.

A solução é dizer ao compilador para produzir código para sistemas x86 (porque a maioria das assemblies/bibliotecas apenas suporta sistemas x86). Depois de fazer isto o problema deverá ter desaparecido (o código produzido para sistemas x86 deverá correr em sistemas de 64 bits).

Em seguida explicarei os passos para configurar a plataforma de um projecto. A explicação será feita usando o Visual Studio 2005, mas com outra versão os passos deverão ser quase os mesmos.

Precisamos de fazer o seguinte:

  • Ir à página de propriedades da solução
  • Seleccionar o Configuration Manager
  • Adiciona uma nova plataforma (para sistemas x86) ao projecto

Primeiro é necessário ir às propriedades da solução. No Solution Explorer seleccionem a vossa solução, usem o botão direito do rato e escolham Properties.

Right-Click Solution Properties
Right-Click Solution Properties

Uma caixa de diálogo com as Property Pages deverá aparecer. Certifiquem-se que a opção Configuration Properties está seleccionada no lado esquerdo da janela. Pressionem o botão Configuration Manager que aparece no canto superior direito da caixa de diálogo.

Solution Property Pages
Solution Property Pages

Aparece o Configuration Manager. Agora deverão ir até à coluna Platform do vosso projecto e escolher a opção "<New...>".

Configuration Manager
Configuration Manager

Aparece uma janela para configurarem a vossa nova plataforma. Na primeira opção escolham "x86", no campo Copy settings from: escolham a opção "<Empty>" e deixem a checkbox desactivada. Pressionem o botão "OK" para fechar a janela.

New Project Platform
New Project Platform

O projecto deverá agora aparecer com a opção "x86" na coluna Platform no Configuration Manager. Fechem a janela Configuration Manager e pressionem o botão "OK" para fechar as propriedades da solução. O programa deverá agora correr sem este problema.

Nuno Freitas
Publicado por Nuno Freitas em 07 março, 2008

Artigos relacionados