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 DllNotFoundException
caso 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. ;)
Respostas:
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.
fonte
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.
fonte
No Visual Studio , clique com o botão direito do mouse em seu projeto -> no painel esquerdo, clique na guia Compilar ,
em Destino da plataforma, selecione x86 (ou mais geralmente a arquitetura para corresponder à biblioteca à qual você está vinculando)
Espero que isso ajude alguém! :)
fonte
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.
fonte
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
fonte
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!
fonte
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.
fonte
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.
fonte
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?
fonte
Veja também esta resposta , que resolveu o mesmo problema para mim.
fonte
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
fonte
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.
fonte
Tivemos um problema semelhante e conseguimos corrigi-lo definindo o destino da plataforma como x86.
fonte
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. :)
fonte
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.
fonte
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 :)
fonte
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 projeto
x86
No seu
csproj
arquivo, adicioneIsso foi usado para uma máquina Windows, você teria que ajustar caminhos para Linux / OSX
fonte
Se você estiver importando DLL não gerenciada, use
no seu método de importação de DLL.
fonte
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.
fonte