Não foi possível carregar o arquivo ou o assembly ... Foi feita uma tentativa de carregar um programa com um formato incorreto (System.BadImageFormatException)


409

Eu tenho dois projetos ProjectAe ProjectB. ProjectBé um aplicativo de console, do qual depende ProjectA. Ontem, tudo estava funcionando bem, mas de repente hoje, quando corro ProjectB, recebo o seguinte:

BadImageFormatException não foi tratado : não foi
possível carregar o arquivo ou assembly 'ProjectA, Versão = 1.0.0.0, Culture = neutral, PublicKeyToken = null' ou uma de suas dependências. Foi feita uma tentativa de carregar um programa com um formato incorreto.

Ambos são apenas projetos regulares, sem dependências de outros projetos que não sejam da Net. Ambos são totalmente .Net - não há código nativo nem P / Invoke. Tenho outros projetos que dependem ProjectAe ainda funcionam muito bem.

Coisas que tentei:

  • Verifique se os dois projetos estão definidos como "Qualquer CPU", com a caixa de seleção compilar marcada. Eles são.
  • Verifique se os dois projetos são para o mesmo Target Framework (.Net 4.0 Client Profile) .
  • Em ProjetoB -> Referências -> ProjetoA -> Propriedades, verifique se "Copiar local" está definido como "Verdadeiro" _ (verifiquei que o ProjectA.dll está sendo copiado corretamente)
  • Limpe / reconstrua a solução. Até tentei excluir manualmente as pastas / bin e / obj nos dois projetos.
  • Reinicie o Visual Studio. Reinicie meu computador.
  • Confira uma cópia totalmente nova do repositório.

Mas ainda recebo o mesmo erro. Não tenho ideia do que fiz para causar isso, nem como consertá-lo. Alguma ideia?


1
Se você tiver um histórico de versões no repositório, poderá verificar se existem algumas diferenças nos arquivos csproj?
Steve

@ Steve: De acordo com Mercurial, nenhuma alteração que não seja adicionando referências a novos arquivos de cs
BlueRaja - Danny Pflughoeft

Você tem o mesmo comportamento em outra máquina? Alguma outra coisa mudou na máquina (por exemplo, atualização do Windows, atualizações de dependência etc.)?
9608 Mike Parkhill

Você tentou reverter esses novos arquivos .cs?
Mike Parkhill

2
Isso funcionou para mim ............ stackoverflow.com/a/9419522/191403
Som

Respostas:


647

Tenho certeza de que você está tendo um conflito de 32 ou 64 bits. Parece que seu projeto principal pode estar definido como 32 bits, enquanto a classe de referência está definida como 64 bits. Tente olhar para esta questão SO e esta também . Entre os dois, você poderá descobrir seu problema.


71
Não. De alguma forma, perdi completamente a lista suspensa "destino da plataforma" project-->properties-->build- foi definida para x86; defini-lo como "Qualquer CPU" corrigiu esse problema. Eu sempre pensei que essa configuração era a mesma do menu suspenso "destino da plataforma" no gerenciador de configuração, mas aparentemente não é (na verdade, o "destino da plataforma" no gerenciador de configuração parece não fazer nada!)
BlueRaja - Danny Pflughoeft

10
Verifique também se o projeto não está marcado com Qualquer CPU com Prefer 32 bits. Projeto -> Propriedades -> construção
Reid Evans

26
PS: Outro motivo é "Ativar aplicativos de 32 bits" sendo "falso" nas configurações do pool de aplicativos. Você precisa reiniciar o IIS depois de configurá-lo como verdadeiro.
dvdmn

3
O pior que aconteceu comigo com esse erro foi quando o VS decidiu anexar <PlatformTarget>x86</PlatformTarget>um dos projetos dependentes sem nenhum motivo. Se eu não tivesse pesquisado o SVN, nunca descobriria por que nosso aplicativo MVC falha ao iniciar.
jahu

1
Defina no IIS DefaultAppPool-> Ativar aplicativos de 32 bits = True
Shantu 12/17/17 /

195

Pode ser que você esteja enfrentando o problema com seu site após a implantação no servidor.

Então você precisa ajustar o pool de aplicativos para Ativar aplicativos de 32 bits .

Passos

  1. Abra o Gerenciador do IIS
  2. Clique em Pools de aplicativos
  3. Selecione o pool de aplicativos que você está usando
  4. No painel direito, clique em Configurações avançadas ...

  5. Defina Ativar aplicativos de 32 bits como True

    Configurações avançadas Ativar 32 bits


1
Perdi alguma coisa? O OP está falando de um aplicativo de console, e não da implantação do IIS: "O ProjectB é um aplicativo de console, que depende do ProjectA"
MickyD 03/02/16

129

Acabei de receber esta mensagem de erro executando o IIS Express no Visual Studio 2015. No meu caso, eu precisava estar executando a versão de 64 bits do IIS Express:

Ferramentas → Opções → Projetos e soluções → Projetos da Web
Marque a caixa que diz "Usar a versão de 64 bits do IIS Express para sites e projetos".

Captura de tela:

Captura de tela das opções do VS para o Web Project.


2
O oposto se aplica a, tive a 'Use 64 bit' marcada e necessário para que desmarque ...
cjb110

32

Eu tenho esse mesmo problema. Eu havia definido o "Destino da plataforma" do Projeto A ("Projeto A" (clique com o botão direito) -> Propriedades-> Construção -> "Destino da plataforma") para x86, mas mantive o Projeto B em "Qualquer CPU". Definir o projeto B como "x86" corrigiu isso.


15

Eu tive esse problema ao executar testes de unidade (xunit) no Visual Studio 2015 e me deparei com a seguinte correção:

Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64

7

Pode ser necessário alterar a configuração do pool de aplicativos "Ativar aplicativos de 32 bits" para TRUE no IIS7 se você tiver pelo menos 1 dll de 32 bits \ exe em seu projeto.


OP está falando sobre um aplicativo de console, não IIS
MickyD 03/02

5

Primeiro, obtive isso no VS2017 com um projeto antigo que precisava fazer uma pequena alteração e aprimorei todos os projetos para a estrutura 4.7.


Vários outros mencionaram que a seleção Any CPUpode corrigir esse problema.

Há alguns lugares que você precisa fazer e pode não ser tão simples quanto selecionar na lista suspensa. Isso corrigiu para mim:

1) Você precisa fazer as duas coisas aqui:

insira a descrição da imagem aqui

2) E também em Configuration Manager(clique direito na solução)

insira a descrição da imagem aqui

Mas e se não estiver lá ???

Em seguida, clique Newe escolha estas configurações: ( obrigado @RckLN )

insira a descrição da imagem aqui


2

Eu tive o mesmo problema com vários projetos na mesma solução, acabei definindo todas as estruturas de destino para .NET Framework 4 e x86 para a CPU de destino e ela finalmente foi compilada com êxito.


1
Trabalhou na versão mas falhou na depuração. Defina tudo como .Net Framework 4 (NÃO atualização 1) e a depuração será executada agora.
precisa saber é o seguinte

2

Você também pode ver esse problema se estiver tentando empacotar um projeto de 64 bits com um instalador MSI no VS. ("O motivo é que o shim nativo empacotado com o arquivo .msi é um executável de 32 bits.")

Consulte aqui para obter mais detalhes: http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


1
Considere resumir o artigo vinculado para benefício de futuros leitores; caso o link fique inoperante.
Ligação - Java de Bond

2

Nenhuma dessas soluções funcionou para mim - mas, ao excluir o conteúdo das pastas bin e obj, tudo ficou legal novamente.


2

Consegui isso ao criar um projeto via Build do Visual Studio Online (VSTS) usando as Visual Studio BuildEtapas.

A solução foi:

  • Exclua a pasta de origem existente
  • Defina explicitamente 'Qualquer CPU' na plataforma para todas as compilações do Visual Studio, incluindo dependências (veja a captura de tela abaixo).
  • Execute novamente a compilação

Captura de tela do VSO


2

A seguir, resolvi o problema para mim, desmarque 'Preferir 32 bits': insira a descrição da imagem aqui


1

Eu encontrei o mesmo problema. Surgiu do nada e isso me pareceu estranho.

No instantâneo Exception, para o FusionLog, vi o seguinte em sua mensagem:

... C: \ Windows \ Microsoft.NET \ Framework64 ...

Mais sobre o log de fusão: http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

Todos os projetos tinham uma CPU alvo de AnyCPU. Alterei o projeto do aplicativo (o projeto que referencia todos os outros projetos) para uma CPU de destino de x86. Agora funciona.

Não tenho certeza de como a mistura da CPU de destino ocorreu sem motivo aparente, mas ocorreu.


1

Também enfrento esse problema em um projeto. Após alguns minutos, encontrei a solução. Esse problema ocorre devido à configuração da CPU. Se você estiver usando o Visual Studio 2010 ou VS 2013 , basta ir às propriedades do projeto e selecionar Compilar na barra lateral. e haverá 5 menus suspensos; o 5º menu suspenso será a CPU de destino: você deve configurá-lo para x86 ou x64 de acordo com seus requisitos, em vez de Qualquer CPU.

Meu problema foi resolvido depois de alterá-lo para x86.


1

Isso também pode acontecer apenas com a definição de várias estruturas suportadas no arquivo app.config e forçando a execução do aplicativo em uma estrutura .NET diferente da que foi mencionada primeiro no arquivo app.config .

E isso também é acionado quando você tem as duas estruturas mencionadas disponíveis no seu sistema.

Como solução alternativa, abra a estrutura de destino que você usará para a depuração no app.config

ex: se você estiver tentando executar no .NET 4, o arquivo de configuração deve ter algo semelhante a isso,

<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>

1

No meu projeto para C #, propriedade do projeto -> [Build] -> Platform target: Qualquer CPU e desmarque a opção Prefer 32-bit para permitir que o compilador escolha automaticamente.


1

O assembly Chilkat .NET 4.5 requer que o tempo de execução VC ++ 2012 ou 2013 seja instalado em qualquer computador em que seu aplicativo seja executado. A maioria dos computadores já o tem instalado. Seu computador de desenvolvimento o terá porque o Visual Studio foi instalado. No entanto, se estiver implantando em um computador em que o tempo de execução VC ++ necessário não esteja disponível, o erro acima ocorrerá:

Instale todos os pacotes abaixo

Pacotes redistribuíveis do Visual C ++ para Visual Studio 2013 - vcredist_x64

Pacotes redistribuíveis do Visual C ++ para Visual Studio 2013 - vcredist_x86

Pacotes redistribuíveis do Visual C ++ para Visual Studio 2012 - vcredist_x64

Pacotes redistribuíveis do Visual C ++ para Visual Studio 2012 - vcredist_x86



0

Pode ser um pouco engraçado, mas tive o mesmo problema com o código de trabalho normal. Eu adicionei StreamWriter e StreamReader e deu esse erro. A solução foi colocar esse código entre parênteses nos comentários e depurar e ele começou a funcionar novamente



0

No meu caso, faltava uma dependência na DLL que lançou essa exceção. Eu verifiquei com o Dependency Walker, adicionei a dll ausente e o problema foi resolvido.

Mais especificamente, de alguma forma corrompi meu opencv_core340.dll adicionando acidentalmente palavras-chave SVN a ele e, portanto, minha dll não pode mais usá-lo. No entanto, não acredito que a solução para esse problema dependa se a DLL está corrompida ou ausente. Estou apenas adicionando isso para fornecer informações completas.


0

Tiro! Eu sabia sobre esse problema. Eu pensei que estava fazendo tudo certo até que acidentalmente vi 'x86' na janela de saída do VS e foi aí que eu descobri a causa. Desperdiçou alguns minutos hoje.

A configuração na janela 'Publicar' foi definida como 'x86'; enquanto que, em qualquer outro lugar, era 'x64'.

Verifique se está sincronizado no gerenciador de configuração, publique configurações, configurações da solução e configurações do IIS (se esse for o seu servidor da web).

Além disso, lembre-se: o VS é um aplicativo de 32 bits e o IIS é de 64 bits. Aplicativos de 32 bits estão desabilitados por padrão no IIS.

insira a descrição da imagem aqui


0

Eu detectei algo diferente das outras respostas. Atingir essa exceção no meu projeto foi o resultado de uma compilação corrompida. Sem fazer nenhuma alteração, apenas forçando a reconstrução , foi corrigido.


0

Eu tive o mesmo problema. O Projeto B, no meu caso, era uma .Net Core Class Library que possui um Nuget "Microsoft.Management.Infrastructure" instalado. O erro foi que eu chamei meu projeto B de "MI". Mudei o nome do projeto para outra coisa e de repente tudo funcionou novamente.


-1

Minha máquina me mostrou uma atualização do BIOS e me perguntei se isso tinha alguma coisa a ver com o surgimento repentino desse erro. E depois que fiz a atualização, o erro foi resolvido e a solução foi criada com perfeição.


-1

Você está tentando executar o arquivo .exe no cmd? Este foi o meu erro. Basta executar o arquivo .exe clicando duas vezes nele. Se for um .NET Core SCD para Windows 8.1 / Windows Server 2012 R2 x64.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.