BadImageFormatException 문제 해결


107

Visual Studio 2010을 사용하고 전체 .NET Framework 4를 대상으로하는 C #으로 작성된 Windows 서비스가 있습니다. 디버그 빌드에서 실행하면 서비스가 예상대로 실행됩니다. 그러나 릴리스 빌드에서 실행하면 System.BadImageFormatException이 발생합니다 (아래 세부 정보). 나는 인터넷에서 해결책을 찾고 있었지만 지금까지 내가 찾은 모든 것이 해결책을 찾는 데 도움이되지 않았습니다.

이 문제는 Windows 7 64 비트 (dev) 및 Windows XP SP3 32 비트 (대상) 시스템 모두에 존재합니다.

지금까지 시도한 내용은 다음과 같습니다.

  • Platform Target과 같은 확인 된 빌드 설정은 모두 동일합니다 (x86).
  • 어셈블리 바이너리가 유효한지 확인하기 위해 / verbose 옵션과 함께 peverify를 사용했습니다.
  • fuslogvw를 사용하여로드 문제를 찾습니다.
  • CheckAsm을 사용하여 누락 된 파일 또는 어셈블리를 찾았습니다.

이 모든 수표는 아무것도 변경하지 않았습니다. 회사 마스터의 비밀을 보호하기 위해 일부 이름이 변경된 다음 예외 정보의 전체 텍스트를 포함했습니다.

System.BadImageFormatException이 처리되지 않았습니다.
  메시지 = 파일 또는 어셈블리 'XxxDevices, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'또는 해당 종속성 중 하나를로드 할 수 없습니다. 잘못된 형식으로 프로그램을로드하려고했습니다.
  소스 = XxxDevicesService
  FileName = XxxDevices, 버전 = 1.0.0.0, Culture = neutral, PublicKeyToken = null
  FusionLog = 어셈블리 관리자로드 : C : \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll
실행 파일 c : \ Dev \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe에서 실행
--- 자세한 오류 로그는 다음과 같습니다. 

=== 사전 바인딩 상태 정보 ===
로그 : 사용자 = XXX
로그 : DisplayName = XxxDevices, 버전 = 1.0.0.0, Culture = neutral, PublicKeyToken = null
 (완전히 지정됨)
로그 : Appbase = file : /// c : / Dev / TeamE / bin / Release /
로그 : 초기 PrivatePath = NULL
어셈블리 호출 : XxxDevicesService, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null.
===
LOG :이 바인딩은 기본로드 컨텍스트에서 시작됩니다.
로그 : 응용 프로그램 구성 파일 사용 : c : \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe.Config
로그 : 호스트 구성 파일 사용 : 
로그 : C : \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config에서 컴퓨터 구성 파일 사용.
LOG : 현재 참조에 정책이 적용되지 않습니다 (개인, 사용자 지정, 부분 또는 위치 기반 어셈블리 바인딩).
LOG : 새 URL 파일 다운로드 시도 : ///c:/TeamE/bin/Release/XxxDevices.DLL.
오류 : 어셈블리 설정을 완료하지 못했습니다 (hr = 0x8007000b). 조사가 종료되었습니다.

  StackTrace :
       XxxDevicesService.Program.Main (String [] args)에서
       System.AppDomain._nExecuteAssembly (RuntimeAssembly 어셈블리, String [] args)에서
       Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()에서
       System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)에서
       System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Object state)에서
       System.Threading.ThreadHelper.ThreadStart ()에서
  InnerException : 
c#  .net  exception 

네이티브 코드 / .net을 전혀 혼합하고 있습니까?
Keith Nicholas

1
이 예외가 x86 / x64 비트 차이와 관련되어 있다는 사실을 잘 알고 있습니다. 나는 이것이 웹 응용 프로그램이 아니라고 가정합니다. 또한 어떤 유형의 어셈블리 XxxDevicesService입니까? 특정 플랫폼 (예 : 32 비트) 용으로 컴파일 되었습니까? 그렇다면 플랫폼을 32 비트로 컴파일해야합니다.
Reddog 2012 년

답변:


121

Platform Target과 같은 확인 된 빌드 설정은 모두 동일합니다 (x86).

그것은 충돌 로그가 말하는 것이 아닙니다.

어셈블리 관리자 : C : \ Windows \ Microsoft.NET \ Framework64

64 비트 버전의 프레임 워크가있는 이름 의 64 를 참고하십시오 . 클래스 라이브러리 프로젝트가 아닌 EXE 프로젝트 에서 대상 플랫폼 설정을 설정하십시오 . XxxDevicesService EXE 프로젝트는 프로세스의 비트를 결정합니다.


6
EXE 프로젝트를 확인하는 동안 디버그 릴리스를 모두 확인하십시오 . : /
chris

44

일주일 내내이 문제를 해결하기 위해 책상에 머리를 두드리는 것을 멈춘 후, 나는 나를 위해 일한 것을 공유하고 있습니다. Win7 64 비트, 32 비트 Oracle 클라이언트가 있고 Oracle 비트로 인해 x86 플랫폼에서 실행되도록 MVC 5 프로젝트를 설정했습니다. 같은 오류가 계속 발생했습니다.

파일 또는 어셈블리 'Oracle.DataAccess'또는 해당 종속성 중 하나를로드 할 수 없습니다. 잘못된 형식으로 프로그램을로드하려고했습니다.

NuGet 패키지를 다시로드하고, 다른 앱에서 다른 앱에서 작동했던 DLL의 복사본을 사용하고, 프로젝트의 bin 폴더를 가리 키도록 종속 어셈블리의 코드베이스를 설정하고, CopyLocal을 true 또는 false로 시도하고 모든 것을 시도했습니다 . 마지막으로 코드를 확인하고 싶었고 새로운 계약자로서 Subversion을 설정하지 않았습니다. VS에 연결하는 방법을 찾는 동안 나는 대답을 넘어 섰습니다. 내가 찾은 것은 Tools => Options 메뉴의 Projects and Solutions => Web Projects 섹션에서 "Use the 64 bit version of IIS Express for Web Sites and Projects"옵션의 선택을 취소하는 것입니다.


3
얼마나 생명의 은인 !! 감사합니다. 제 프로젝트는 사실상 x64이기 때문에 실제로 이것을 확인해야했습니다. 다시 한 번 감사드립니다 !!!
독사는

여기에서받은 모든 도움을받은 후, 일부를 지불 할 수있게되어 매우 기쁩니다!
Joseph Morgan

3
로컬 IIS를 사용하는 경우 앱 풀의 "32 비트 응용 프로그램 사용"(고급 설정 아래)이 True 로 설정되어 있는지 확인하십시오 .
Eric Eskildsen

같은 당신이 있는지 여부에 대한 추가 단서를 제공 할 수 스위치를 내리고, 당신은 실제 환경에서 그렇게하지 않으려는 경우에도, 응용 프로그램 풀에 "32 비트 응용 프로그램 사용"에 대해 위의 EricEskildsen의 코멘트 @에 addenum 되는 32 직면을 -비트 / 64 비트 문제 또는 다른 것.
a CVn

팔! 그거였다.
itslittlejohn

21

내가 찾은 것은 Tools => Options 메뉴의 Projects and Solutions => Web Projects 섹션에서 "Use the 64 bit version of IIS Express for Web Sites and Projects"옵션을 확인하는 것입니다.


당신은 구세주입니다. +1
Amit Kumar

VS를 다시 설치하고이 문제를 해결했습니다 (감사합니다-이 솔루션이 효과가 있음). 저에게있어 이야기의 도덕은 제가 처음부터 코드를 변경하지 않았다는 것을 안다면 VS의 구성을 먼저 살펴 봐야 할 것입니다.
taylorswiftfan

@Lucy 확인란 '웹 사이트 및 프로젝트에 IIS Express 64 비트 버전 사용'이 desabled
k_kumar

Lucy에게 알려주세요
k_kumar

12

일반적으로 .csproj의 대상 프레임 워크를 변경하고 처음 시작한 프레임 워크로 되돌릴 때 발생할 수 있습니다.

app.config의 시작 태그 아래에서 supportedRuntime version = "a different runtime from cs project target"이면 1을 확인하십시오.

2 또한 자동 생성 된 다른 파일이나 다른 파일을 속성 폴더로 확인하여 이러한 파일과 .csproj 파일에 정의 된 파일간에 더 이상 런타임 불일치가 없는지 확인합니다.

이는 오류를 극복하기 위해 프로젝트 속성으로 다른 작업을 시작하기 전에 많은 시간을 절약 할 수 있습니다.


나는 비슷한 문제를 발견했고 당신의 대답은 나의 해결책이었습니다. 내 app.config에는 지원되는 런타임이 다릅니다.
Krisztián Kis

9

64 비트 Windows 7이 있고 프로젝트 속성에서 64 비트 DLL b / c를로드했지만 동일한 문제가 발생했습니다. | 빌드 "Prefer 32-bit"를 체크했습니다. (기본적으로 설정되어있는 이유를 모르겠습니다.) 확인을 취소하면 모든 것이 잘 실행되었습니다.


1
여기도 마찬가지입니다. 이것은 트릭을했다. 64 비트 어셈블리를 참조하고 활성 빌드 구성이 모든 CPU로 설정되었지만이 "32 비트 선호"설정으로 인해 응용 프로그램을 실행하는 데 32 비트가 사용되어 문제가 발생했습니다.
베르누이 IT

왔는데 어떤 CPU 대신 86 디버그 모드와 마법처럼 일했다.
Cardi DeMonaco Jr.

7

응용 프로그램이 .NET Framework 4.5를 대상으로하고 (예 :) 다음 app.config가있는 경우에도이 예외가 발생할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>

응용 프로그램의 디버그를 시작하려고하면 BadImageFormatException이 발생합니다.

v2.0 버전을 선언하는 줄을 제거하면 오류가 지워집니다.

최근에 이전 .NET 2.0 프로젝트에서 .NET 4.5로 대상 플랫폼을 변경하려고 할 때이 문제가 발생했습니다.


6

배경

우리는 오늘 IIS 6.2를 실행하는 Windows 2012 R2 서버에서 WCF 서비스를 AnyCPU에서 x64로 전환했을 때이를 시작했습니다.

먼저 참조 된 유일한 어셈블리를 10 번 확인하여 실제로 x86 dll이 아닌지 확인했습니다. 다음으로 응용 프로그램 풀을 여러 번 확인하여 32 비트 응용 프로그램을 활성화하지 않았는지 확인했습니다.

나는 변덕스럽게 설정을 전환하려고했습니다. IIS의 응용 프로그램 풀은 32 비트 응용 프로그램 사용 값이 False 로 기본 설정되어 있지만 IIS는 어떤 이유로 서버에서이를 무시하고 항상 x86 모드에서 서비스를 실행했습니다.

해결책

  • 앱 풀을 선택합니다.
  • 선택 설정 응용 프로그램 풀 기본값 ... 또는 고급 설정을 ... .
  • 32 비트 응용 프로그램 활성화 를 True로 변경합니다 .
  • 클릭 OK .
  • 선택 설정 응용 프로그램 풀 기본값 ...... 고급 설정을 다시.
  • 변화는 32 비트 응용 프로그램 사용을 False로 백업 할 수 있습니다.
  • 클릭 OK .

4

다른 "응용 프로그램 풀"을 사용하도록 웹 앱을 변경하여이 문제를 해결했습니다.


4

나중에 여기에 도착할 수있는 사람을 위해 .... 내 모든 어셈블리는 괜찮 았습니다. 내 Visual Studio 프로젝트 중 하나에 있으면 안되는 앱 구성이 있습니다. 따라서 앱 구성 파일이 필요한지 확인하십시오.

추가 앱 구성을 삭제했고 작동했습니다.


나를 위해 고쳤습니다. 내 App.config는 내 .NET 4.5.1 앱을 2.0 CLR로 설정했습니다!
Jared Thirsk

4

대상 빌드 x64 대상 서버 호스팅 IIS 64 비트

애플리케이션 빌드가 64 비트 OS를 대상으로하는 경우 IIS를 호스팅하는 64 비트 서버에서 웹 사이트 / 웹 애플리케이션을 실행하는 앱 풀에서 32 비트 애플리케이션 활성화를 false로 설정합니다.

여기에 이미지 설명 입력


2

응용 프로그램에서 사용하는 응용 프로그램 풀을 확인하고 32 비트 응용 프로그램 사용을 True로 설정하여 속성을 설정합니다. 이는 응용 프로그램 풀의 고급 설정을 통해 수행 할 수 있습니다.


2

32 비트 또는 64 비트 플랫폼 용 앱을 빌드 할 때 (내 경험은 Visual Studio 2010 사용) Configuration Manager에 의존하여 실행 파일에 대한 올바른 플랫폼을 설정하지 마세요. CM에 응용 프로그램에 대해 x86이 선택되어 있더라도 프로젝트 속성 (빌드 탭)을 확인하십시오. 여전히 "모든 CPU"라고 표시 될 수 있습니다. 64 비트 플랫폼에서 "모든 CPU"실행 파일을 실행하면 64 비트 모드로 실행되고 x86 플랫폼 용으로 빌드 된 동반 DLL로드를 거부합니다.


1

Web.Config에서 System.Runtime에 대한 종속성을 제거하십시오.

<dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
</dependentAssembly>

나를 위해 그것은 System.Net.Http. 감사합니다.
Snickbrack

1

들어 .NET 핵심 하는이 비주얼 스튜디오 2017 버그 프로젝트 속성 빌드 페이지가 잘못된 플랫폼 대상을 표시 될 수 있습니다. 문제가 발견되면 해결 방법은 매우 쉽습니다. 대상을 다른 값으로 변경 한 다음 다시 변경할 수 있습니다.

또는 .csproj에 런타임 식별자를 추가 할 수 있습니다. x86 네이티브 DLL을로드 할 수 있도록 .exe를 x86으로 실행해야하는 경우 다음 요소를에 추가하십시오 PropertyGroup.

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

이것을 놓기 좋은 곳은 TargetFramework또는 TargetFrameworks요소 바로 뒤에 있습니다.


1

나는 아무도 이것을 언급하지 않았기 때문에 위의 도움 중 어느 것도 (내 경우) 공유하지 않을 경우 공유하고 있습니다.

무슨 일이 있었는지 VBCSCompiler.exe 인스턴스가 어떻게 든 멈춰 있었고 실제로 새 인스턴스가 새 파일을 올바르게 쓸 수 있도록 파일 핸들을 해제하지 않아 문제가 발생했습니다. 이것은 내가 "bin"폴더를 삭제하려고했을 때 명백 해졌고 다른 프로세스가 거기에있는 파일을 사용하고 있다고 불평하고있었습니다.

VS를 닫고 작업 관리자를 열고 모든 VBCSCompiler 인스턴스를보고 종료하고 "bin"폴더를 삭제하여 내가 있던 곳으로 돌아갔습니다.

참조 : https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing-after-exiting.html


내 해결책은 모든 bin 및 debug 디렉토리를 삭제하는 것입니다.
gabnaim 19

0

나중에 여기에 도착할 수있는 사람에게는 ...
데스크톱 솔루션의 BadImageFormatException경우 예외 가 발생했습니다.
모든 프로젝트의 빌드 옵션이 괜찮 았습니다 (모두 x86). 하지만 솔루션의 StartUp 프로젝트는 다른 프로젝트 (클래스 라이브러리 프로젝트)로 변경되었습니다.

StartUp 프로젝트를 원본 (.exe 응용 프로그램 프로젝트)으로 변경하는 것이 제 경우에는 해결책이었습니다.


0

이 문제에 직면했을 때 다음이 해결되었습니다.

나는 다른 exe 내부에서 OpenCV dll을 호출하고 있었는데, 내 dll에는 내 exe 파일의 폴더에서 사용 가능한 highgui, features2d 등과 같은 이미 필요한 opencv dll이 포함되어 있지 않았습니다. 이 모든 것을 내 exe 프로젝트의 디렉토리에 복사했는데 갑자기 작동했습니다.


0

이 오류 "파일이나 어셈블리 '예제'또는 해당 종속성 중 하나를로드 할 수 없습니다. 잘못된 형식으로 프로그램을로드하려고했습니다."는 일반적으로 잘못된 응용 프로그램 풀 구성으로 인해 발생합니다.

  1. 사이트가 현재 실행중인 AppPool에 "32 비트 응용 프로그램 사용"이 False로 설정되어 있는지 확인합니다.
  2. 플랫폼에 맞는 올바른 버전을 사용하고 있는지 확인하십시오.
  3. 웹 사이트에서이 오류가 발생하면 응용 프로그램 풀이 올바른 모드에서 실행되도록 설정되어 있는지 확인하십시오 (3.0 사이트는 64 비트 모드에서 실행되어야 함).
  4. 또한 Visual Studio의 해당 어셈블리에 대한 참조가 패키지 폴더의 올바른 파일을 가리키고 있는지 확인해야합니다.
  5. 2.0 사이트 용 GAC에 올바른 버전의 dll이 설치되어 있는지 확인하십시오.
  6. 이는 웹 프로젝트로 승격되는 WSODLib로 인해 발생할 수도 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.