[c#] BadImageFormatException 문제 해결

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 :



답변

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

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

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

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


답변

일주일 내내이 문제를 해결하기 위해 책상에 머리를 두드리는 것을 멈춘 후, 나는 나를 위해 일한 것을 공유하고 있습니다. 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”옵션의 선택을 취소하는 것입니다.


답변

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


답변

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

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

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

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


답변

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


답변

응용 프로그램이 .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로 대상 플랫폼을 변경하려고 할 때이 문제가 발생했습니다.


답변

배경

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

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

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

해결책

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