“Foi feita uma tentativa de carregar um programa com um formato incorreto” mesmo quando as plataformas são as mesmas

461

Estou chamando funções de uma DLL não gerenciada de 32 bits em um sistema de 64 bits. O que eu recebo é:

BadImageFormatException: Foi feita uma tentativa de carregar um programa com um formato incorreto. (Exceção de HRESULT: 0x8007000B)

Inicialmente, meus projetos foram definidos para a plataforma Any CPU, então alterei os dois para x86, mas esse erro ainda está ocorrendo. Essa é realmente a única correção que conheço para isso.

As DLLs não estão corrompidas nem nada, porque eu posso usá-las com outros programas (dos quais não tenho a fonte). Eu pensei que talvez não estivesse encontrando uma dependência, mas verifiquei e eles estão todos lá. Além disso, não seria um DllNotFoundExceptioncaso nesse caso?

O que mais eu posso fazer? E antes que você diga "Use uma DLL não gerenciada de 64 bits", deixe-me salientar que não há uma. ;)

David Brown
fonte
1
Quais projetos você mudou para x86? E como você os executa quando você recebe a exceção, através do depurador ou manualmente? Nesse último caso, você notou que, quando mudou para x86, havia uma nova pasta no seu diretório bin \? Agora é basicamente bin \ x86 \ Debug para os arquivos.
Lasse V. Karlsen
Você pode verificar se o executável está sendo executado no modo de 32 bits (* 32 no gerenciador de processos)?
JP Alioto
@Lasse V. Karlsen: Sim, removi o bit x86 do caminho de saída quando mudei a plataforma em cada projeto. Meu primeiro projeto é uma DLL que agrupa as funções na DLL não gerenciada. O segundo projeto é um executável que usa o wrapper na primeira DLL. Ambos estão definidos como x86.
David Brown
@JP: Na verdade, o gerenciador de processos não mostra que está sendo executado como um processo de 32 bits. Por que é que?
David Brown

Respostas:

532

Se você tentar executar aplicativos de 32 bits no IIS 7 (e / ou computador com SO de 64 bits), receberá o mesmo erro. Portanto, no IIS 7, clique com o botão direito do mouse no pool de aplicativos e vá para "configurações avançadas" e altere "Ativar aplicativos de 32 bits" para "TRUE".

Reinicie seu site e ele deve funcionar.

insira a descrição da imagem aqui

bluwater2001
fonte
1
Oh, meus dias eu tenho procurado instalar componentes extras do IIS quando essa foi a resposta ... Alguém pode sugerir uma desvantagem em ter essa opção selecionada?
notidaho 31/07/12
3
Aqui está uma boa discussão sobre a questão do desempenho em relação a isso: stackoverflow.com/questions/507820/…
Ben Power
Estou com um problema com o SharpSvn e isso não ajuda. :( Sth é muito errado com esta montagem vos digo ...
user2173353
4
Esta resposta é um wtf para mim, porque a pergunta não menciona o IIS!
precisa
129

De alguma forma, a caixa de seleção Compilar no Gerenciador de Configurações havia sido desmarcada para o meu executável, portanto ainda estava sendo executada com a versão antiga Qualquer CPU. Depois de corrigir isso, o Visual Studio reclamou que não podia depurar o assembly, mas que foi corrigido com uma reinicialização.

David Brown
fonte
Muito obrigado. Isso também me pegou. Construção verificada no Configuration Manager e agora funciona (aplicativo de desktop WPF).
Danglund 24/05
1
Se você fez tudo o que foi dito acima e verificou a configuração da plataforma, crie as configurações, limpou a solução e ainda não está funcionando - procure todas as instâncias da DLL e exclua-as.
que você precisa
com o VS 2015 este ainda é válido - embora eu não tinha necessidade de reiniciar :)
increddibelly
É isso aí! Visitar novamente as configurações do Configuration Manager é a resposta.
AndyUK
74

No Visual Studio , clique com o botão direito do mouse em seu projeto -> no painel esquerdo, clique na guia Compilar ,

Propriedades do projeto, guia compilar

em Destino da plataforma, selecione x86 (ou mais geralmente a arquitetura para corresponder à biblioteca à qual você está vinculando)

Propriedades do projeto, destino da plataforma

Espero que isso ajude alguém! :)

Marvin Thobejane
fonte
2
Isso corrigiu meu problema no VS2013. Encontrei uma correção alternativa: deixar "Destino da plataforma" como "Qualquer CPU", mas marque a caixa de seleção "Preferir 32 bits".
User1069816
2
Embora você precise usar o .NET 4.5 ou superior para poder marcar a caixa de seleção "Preferir 32 bits"
user1069816 30/07/2015
1
Sim, mas converti meu projeto em 'Qualquer CPU' para 'x64'. Meu projeto de 32 bits está funcionando bem, mas o mesmo código que eu converti para 64 bits, esse projeto não está funcionando bem como 32 bits. Você pode me dar o próprio processo de conversão de 64 bits ...
Ismayil S
@IsmayilS Verifique se você está usando uma versão da biblioteca que você está ligando para 64 bits
Marvin Thobejane
53

Eu também tive esse problema também. Tentei todas as sugestões aqui, mas elas não ajudaram.

Eu encontrei outra coisa para verificar que corrigia isso para mim. No Visual Studio, clique com o botão direito do mouse no projeto e abra "Propriedades". Clique na guia "Compilar" (ou "Compilar") e, em seguida, clique em "Opções avançadas de compilação" na parte inferior.

Verifique a lista suspensa "CPU de destino". Deve corresponder à "Plataforma" que você está construindo. Ou seja, se você estiver construindo "Qualquer CPU", então "CPU de Destino" deve dizer "Qualquer CPU". Percorra todas as suas plataformas ativando-as e verifique esta configuração.

Denis
fonte
2
E para aqueles que apenas usavam o compilador, minha correção foi adicionar "/ platform: x86" aos sinalizadores do compilador.
Urchin
Isso corrigiu para mim também. Eu tive que ajustar o "destino da plataforma" na guia "Compilar".
Jowen
se você estiver em 64 bits, verifique também o sinalizador "preferir 32 bits". Eu tive que desativá-lo para mim.
N4ppeL 16/04/19
51

Se você encontrar esse erro ao clicar no botão de seta verde para executar o aplicativo, mas ainda deseja executar o aplicativo em 64 bits. Você pode fazer isso no VS 2013, 2015, 2017 e 2019

Vá para: Ferramentas> Opções> Projetos e soluções> Projetos da Web> Use a versão de 64 bits do IIS Express

paibamboo
fonte
3
Obrigado. Eu tentei tantos e nada ajudou. Você é meu salva-vidas. Eu tenho o sistema operacional de 64 bits, instalei um Visual Studio de 64 bits [que ainda é executado como 32 bits por motivo desconhecido]. Quando coloquei o destino da plataforma em x64, estava lançando o erro BadImageFormatException. Com sua correção, funcionou. Eu te dei uma votação. Você é
demais
Eu estou feliz que eu poderia ajudar :)
paibamboo
Esta é a resposta que eu preciso. Muito obrigado!
precisa saber é o seguinte
Muito obrigado, isso resolveu o problema. Funciona bem com o processo de 32 bits do Visual Studio 2017.
Samir105 27/05
1
ainda funciona com o VS 2019, obrigado
Jake Gaston
36

Se você estiver usando Qualquer CPU , poderá encontrar esse problema se a opção Preferir 32 bits estiver marcada:

Certifique-se de desmarcar esta opção no estabelecimento do projeto Desenvolver guia!

insira a descrição da imagem aqui

Drew Noakes
fonte
3
Seria útil se você pudesse indicar onde, no Visual Studio, encontra essa opção.
trysis
@trysis, esta opção está na página Build do painel de configurações do projeto.
de Drew Noakes
1
Eu estava dizendo que seria útil colocá-lo. Como essa resposta está, não há contexto para informar ao infeliz e possivelmente novo usuário do StackOverflow onde encontrá-lo.
trysis
Qual é o caminho para obter este formulário? Não consigo encontrá-lo
Adolfo Correa
No Visual Studio, clique com o botão direito do mouse no projeto e escolha 'Propriedades'.
Drew Noakes
8

Um tópico pouco interessante para esta postagem, mas a busca por essa mensagem de erro me trouxe aqui.

Se você estiver criando através do sistema de equipe e obtendo esse erro, a guia do processo de definição de compilação terá uma configuração "Plataforma MSBuild". Se isso estiver definido como "Auto", você pode enfrentar esse problema. Mudar para "X86" também pode resolver o erro.

StingyJack
fonte
esta é a resposta mais próxima do que eu estava enfrentando. Eu tinha uma DLL que tinha que ser x86. Eu usei em outro projeto, que era AnyCPU por padrão. Eles só precisam combinar. Nesse caso, não fez muita diferença, então mudei o novo projeto para x86.
greg
8

No meu caso, eu estava usando uma DLL nativa em c #. Essa DLL dependia de outras DLLs que estavam faltando. Depois que essas outras DLLs foram adicionadas, tudo funcionou.

Tomasz Stypich
fonte
4

Com base na resposta de @paibamboo

Ele disse: Vá para: Ferramentas> Opções> Projetos e soluções> Projetos da Web> Use a versão de 64 bits do IIS Express

Meu colega de trabalho marcou essa caixa (ele a procurou explicitamente), mas teve a mensagem de erro em questão. Depois de algumas horas, desmarcou a caixa e a verificou novamente. Eis aqui: o código agora foi executado com sucesso.

Parece que existem dois lugares onde o estado desta caixa não é salvo e que ficou fora de sincronia. Desfazer a verificação e sincronizá-la novamente.

Pergunta para usuários mais qualificados: Houve uma atualização ou algo na semana passada (para o VS 2015) que dessincronizou os estados?

MilConDoin
fonte
3

Veja também esta resposta , que resolveu o mesmo problema para mim.

Postado por Luis Mack em 12/5/2010 às 8:50. Encontrei o mesmo problema, apenas para um projeto específico ao compilar em uma máquina de 64 bits. Uma correção que parece funcionar é alterar manualmente um caractere no fluxo de imagem, TODA vez que o controle ou formulário do usuário é editado no designer

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Mudar para

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Isso é 00LjAuMC4w de volta a 0yLjAuMC4w no final da linha (00 de volta a 0y)

Shaul Behr
fonte
1
Um resumo breve da ligação seria @Shaul útil :)
Marvin Thobejane
Magnífico. Graças, o briefing adiciona conteúdo ao seu comentário
Marvin Thobejane
2

No meu caso, estou usando um pequeno .exe que recarrega as DLLs referenciadas via Reflection. Então, eu apenas sigo estas etapas que salvam meu dia:

Nas propriedades do projeto no Solution Explorer, na guia Build, eu escolho o destino platfrom x86

asdf_enel_hak
fonte
2

No meu caso, eu estava executando testes no MSTest e descobri que estava implantando uma DLL de 32 e 64 bits no diretório de teste. O programa estava favorecendo a DLL de 64 bits e causando falha.

TL; DR Certifique-se de implantar apenas DLLs de 32 bits nos testes.

Mike Cluck
fonte
2

Tivemos um problema semelhante e conseguimos corrigi-lo definindo o destino da plataforma como x86. Propriedades do projeto-> construir

Joe
fonte
Dlls x86 são diferentes de x64? Existe uma maneira de detectar isso em um arquivo DLL referenciado?
NoBugs
@NoBugs Parece que você pode. Dê uma olhada neste tópico
Joe
1

Eu resolvi esse problema da maneira 'Windows'. Depois de verificar todas as minhas configurações, limpar a solução e recriá-la, simplesmente fechei a solução e a reabri. Então funcionou, então o VS provavelmente não se livrou de algumas coisas durante a limpeza. Quando as soluções lógicas não funcionam, costumo recorrer a soluções ilógicas (ou aparentemente ilógicas). O Windows não me decepciona. :)

user1771386
fonte
1

Consegui corrigir esse problema, correspondendo minha versão de compilação à versão do .NET no servidor.

Cliquei duas vezes no .exe apenas para ver o que aconteceria e ele me disse para instalar o 4.5 ....

Então, eu rebaixei para 4.0 e funcionou!

Portanto, verifique se suas versões correspondem. Ele foi executado na minha caixa de desenvolvimento bem, mas o servidor tinha uma versão .NET mais antiga.

Nateous
fonte
1

No meu caso, foi o conteúdo errado do arquivo. A DLL foi baixada da Web, mas o conteúdo da DLL era uma página HTML: D Tente verificar se é um arquivo binário, se parece que a DLL está correta :)

Ludwo
fonte
1

Estávamos tendo o mesmo problema no núcleo do .NET. A solução foi fazer o download do tempo de execução .netcore de 32 bits e ter como alvo o projetox86

No seu csprojarquivo, adicione

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

Isso foi usado para uma máquina Windows, você teria que ajustar caminhos para Linux / OSX

Samir Banjanovic
fonte
0

Se você estiver importando DLL não gerenciada, use

CallingConvention = CallingConvention.Cdecl 

no seu método de importação de DLL.

Ramkumar Shanmugam
fonte
0

1: Vá para: Ferramentas> Opções> Projetos e soluções> Projetos da Web> Use a versão de 64 bits do IIS Express 2: altere a configuração abaixo para o projeto de serviço da Web. insira a descrição da imagem aqui

Mani
fonte