파일 또는 어셈블리를로드 할 수 없습니다 ... 형식이 잘못된 프로그램을로드하려고했습니다 (System.BadImageFormatException).


408

나는 두 개의 프로젝트를 가지고 ProjectAProjectB. ProjectB에 의존하는 콘솔 응용 프로그램입니다 ProjectA. 어제 모든 것이 잘 작동했지만 갑자기 오늘 달릴 때 나는 ProjectB이것을 얻습니다.

BadImageFormatException이 처리되지 않았습니다 .
파일 또는 어셈블리 'ProjectA, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'또는 해당 종속성 중 하나를로드 할 수 없습니다. 형식이 잘못된 프로그램을로드하려고했습니다.

둘 다 일반 프로젝트이며 다른 비 .Net 프로젝트에 대한 종속성이 없습니다. 둘 다 완전히 .Net입니다. 기본 코드가 없으며 P / Invoke가 없습니다. 의존 ProjectA하고 여전히 잘 작동 하는 다른 프로젝트가 있습니다.

내가 시도한 것 :

  • 빌드 체크 박스를 체크 한 상태에서 두 프로젝트 모두 "Any CPU"로 설정되어 있는지 확인하십시오 . 그들은.
  • 두 프로젝트가 동일한 대상 프레임 워크 (.Net 4.0 클라이언트 프로파일)에 맞는지 확인하십시오 .
  • ProjectB에서 -> 참고 문헌 -> PROJECTA는 -> 속성이 있는지 확인 "로컬 복사가" 로 설정 "참" _ (나는 ProjectA.dll가 제대로 복사되는 것을 확인)
  • 솔루션을 청소 / 재 구축하십시오. 두 프로젝트에서 / bin 및 / obj 폴더를 수동으로 삭제하려고했습니다.
  • Visual Studio를 다시 시작하십시오. 컴퓨터를 다시 시작하십시오.
  • 완전히 새로운 저장소 사본을 확인하십시오.

그러나 여전히 같은 오류가 발생합니다. 이 문제의 원인과 해결 방법을 모릅니다. 어떤 아이디어?


1
저장소에 버전 히스토리가있는 경우 csproj 파일에 약간의 차이가 있는지 확인할 수 있습니까?
Steve

의욕에 따르면, 새로운 .cs 파일에 대한 참조를 추가하는 것보다 다른 변화 : @ 스티브
BlueRaja - 대니 Pflughoeft

다른 컴퓨터에서도 같은 동작을합니까? 컴퓨터에서 다른 사항이 변경 되었습니까 (예 : Windows 업데이트, 종속성 업데이트 등)?
Mike Parkhill

새 .cs 파일을 되돌리려 고 했습니까?
Mike Parkhill

2
이것은 나를 위해 일했다 ......... stackoverflow.com/a/9419522/191403
Som

답변:


647

32 비트 / 64 비트 충돌이 있다고 확신합니다. 참조하는 클래스가 64 비트로 설정된 동안 기본 프로젝트가 32 비트로 설정되어있는 것 같습니다. 이 SO 질문이것도 살펴보십시오 . 둘 사이에서 문제를 파악할 수 있어야합니다.


71
도 "플랫폼 대상"드롭 다운이 완전히 누락되었습니다 project-->properties-->build. x86 용으로 설정되었습니다. "모든 CPU"로 설정하면이 문제가 해결되었습니다. 항상이 설정이 구성 관리자의 "플랫폼 대상"드롭 다운과 동일하다고 생각했지만 실제로는
BlueRaja -Danny Pflughoeft

10
또한 프로젝트가 32 비트를 선호하는 CPU가 아닌지 확인하십시오. 프로젝트-> 속성-> 빌드
Reid Evans

26
PS : 또 다른 이유는 앱 풀 설정에서 "32 비트 응용 프로그램 사용"이 "거짓"인 것입니다. IIS를 true로 설정 한 후 IIS를 다시 시작해야합니다.
dvdmn

3
이 오류로 인해 최악의 상황은 VS <PlatformTarget>x86</PlatformTarget>가 아무런 이유없이 종속 프로젝트 중 하나 를 추가하기로 결정했을 때였 습니다. SVN을 조사하지 않았다면 MVC 앱이 왜 시작되지 않는지 알 수 없었을 것입니다.
jahu

1
IIS DefaultAppPool-> Enable 32-Bit Applications = True
Shantu

195

서버에 배포 한 후 웹 사이트에 문제가있을 수 있습니다.

그런 다음 32 비트 응용 프로그램 사용으로 응용 프로그램 풀을 조정해야합니다 .

단계

  1. IIS 관리자 열기
  2. 응용 프로그램 풀을 클릭하십시오
  3. 사용중인 응용 프로그램 풀을 선택하십시오.
  4. 오른쪽 분할 창에서 고급 설정 ...을 클릭하십시오.

  5. 32 비트 응용 프로그램 사용을 True로 설정

    고급 설정 32 비트 활성화


1
내가 뭘 놓 쳤니? OP는 IIS 배포가 아닌 콘솔 응용 프로그램 에 대해 이야기하고 있습니다 . "ProjectB는 ProjectA에 의존하는 콘솔 응용 프로그램입니다"
MickyD

129

방금 Visual Studio 2015에서 IIS Express를 실행하는이 오류 메시지가 나타났습니다. 제 경우에는 64 비트 버전의 IIS Express를 실행해야했습니다.

도구 → 옵션 → 프로젝트 및 솔루션 → 웹 프로젝트
"웹 사이트 및 프로젝트에 IIS Express의 64 비트 버전 사용"이라는 상자를 선택하십시오.

스크린 샷 :

웹 프로젝트에 대한 VS 옵션의 스크린 샷.


2
반대의 경우에, 나는 '64 비트 사용 '을 체크하고 그것을
풀어야

32

나는이 같은 문제가 있었다. 프로젝트 A의 "플랫폼 대상"( "프로젝트 A"(> 오른쪽 클릭)-> 속성-> 빌드-> "플랫폼 대상")을 x86으로 설정했지만 프로젝트 B를 "모든 CPU"로 유지했습니다. 프로젝트 B를 "x86"으로 설정하면이 문제가 해결되었습니다.


15

Visual Studio 2015에서 단위 테스트 (xunit)를 실행하는 동안이 문제가 발생했으며 다음 수정 사항을 발견했습니다.

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

7

프로젝트에 32 비트 dll \ exe가 1 개 이상 있으면 IIS7 에서 Appication Pool 설정 "32bit Applications 사용"을 TRUE 로 변경해야 할 수 있습니다 .


OP는 IIS가 아닌 콘솔 앱에 대해 이야기하고 있습니다.
MickyD

5

먼저 VS2017에서 오래된 프로젝트 로이 작업을 수행하여 모든 프로젝트를 약간 변경하고 프레임 워크 4.7로 변경해야했습니다.


다른 사람들이 선택 Any CPU하면이 문제를 해결할 수 있다고 언급 했습니다.

필요한 몇 곳이 있으며 드롭 다운에서 선택하는 것만 큼 간단하지 않을 수 있습니다. 이것은 나를 위해 그것을 고쳤다 :

1) 여기서 두 가지를 모두 수행해야합니다.

여기에 이미지 설명을 입력하십시오

2) 또한 Configuration Manager(솔루션을 마우스 오른쪽 버튼으로 클릭하십시오)

여기에 이미지 설명을 입력하십시오

그러나 그것이 없다면 어떻게 될까요 ???

그런 다음을 클릭 New하고 다음 설정을 선택 하십시오 . ( thanks @RckLN )

여기에 이미지 설명을 입력하십시오


2

동일한 솔루션의 여러 프로젝트에서 동일한 문제가 발생하여 대상 CPU에 대해 모든 대상 프레임 워크를 .NET Framework 4 및 x86으로 설정하고 마침내 성공적으로 컴파일되었습니다.


1
릴리스에서는 작동했지만 디버그에서는 실패했습니다. 모두 .Net Framework 4 (NOT Update 1)로 설정하면 디버그가 실행됩니다.
DCastenholz

2

VS에서 MSI 설치 관리자를 사용하여 64 비트 프로젝트를 패키지하려고하면이 문제가 표시 될 수도 있습니다. "이 이유는 .msi 파일로 패키지 된 기본 shim이 32 비트 실행 파일이기 때문입니다."

자세한 내용은 여기를 참조하십시오 : http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


1
미래 독자들의 이익을 위해 관련 기사를 요약 해보십시오. 링크가 끊어진 경우
본드-자바 본드

2

이 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 그러나 bin 및 obj 폴더의 내용을 삭제하면 모든 것이 다시 멋졌습니다.


2

Visual Studio BuildSteps를 사용하여 Visual Studio Online (VSTS) 빌드를 통해 프로젝트를 빌드 할 때 이것을 얻었습니다 .

해결책은 다음과 같습니다.

  • 기존 소스 폴더 삭제
  • 종속성을 포함하여 모든 Visual Studio 빌드에 대해 플랫폼에서 '모든 CPU'를 명시 적으로 설정하십시오 (아래 스크린 샷 참조).
  • 빌드를 다시 실행

VSO 스크린 샷


2

다음은 나를 위해 문제를 해결했습니다 .'32 비트 선호 '를 선택 취소하십시오. 여기에 이미지 설명을 입력하십시오


1

같은 문제가 발생했습니다. 그것은 파란색에서 튀어 나와서 저에게는 이상해 보였습니다.

예외 스냅 샷에서 FusionLog의 메시지에서 다음을 확인했습니다.

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

퓨전 로그에 대한 자세한 내용 : http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

모든 프로젝트에는 AnyCPU의 대상 CPU가있었습니다. 응용 프로그램 프로젝트 (다른 ​​모든 프로젝트를 참조하는 프로젝트)를 대상 CPU x86으로 변경했습니다. 이제 작동합니다.

명백한 이유없이 대상 CPU 믹스가 어떻게 발생했는지 확실하지 않지만 실제로 발생했습니다.


1

또한 프로젝트 에서이 문제에 직면했습니다. 몇 분 후에 해결책을 찾았습니다.이 문제는 CPU 구성 때문입니다 .Visual Studio 2010 또는 VS 2013을 사용하는 경우 프로젝트 속성 으로 이동 한 다음 사이드 바 에서 컴파일 을 선택하십시오. 5 개의 드롭 다운이 있고 5 번째 드롭 다운이 대상 CPU 가됩니다 . 모든 CPU 대신 요구 사항에 따라 x86 또는 x64로 설정해야합니다 .

x86으로 변경 한 후에 문제가 해결되었습니다.


1

이는 app.config 파일 에 여러 개의 지원되는 프레임 워크가 정의되어 있고 app.config 파일에서 처음 언급 한 것과 다른 .NET 프레임 워크에서 앱이 실행되도록 함으로써 발생할 수 있습니다 .

또한 시스템에서 언급 된 프레임 워크를 모두 사용할 때 발생합니다.

해결 방법으로 app.config에서 디버깅에 사용할 대상 프레임 워크를 불러옵니다.

예 : .NET 4에서 실행하려고하면 구성 파일에 이와 비슷한 것이 있어야합니다.

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

1

C #의 프로젝트에서 프로젝트 속성-> [빌드]-> 플랫폼 대상 : 모든 CPU를 선택하고 32 비트 선호를 선택 해제하여 컴파일러가 자동으로 선택하도록하십시오.


1

Chilkat .NET 4.5 어셈블리를 사용하려면 응용 프로그램이 실행되는 모든 컴퓨터에 VC ++ 2012 또는 2013 런타임이 설치되어 있어야합니다. 대부분의 컴퓨터에는 이미 설치되어 있습니다. Visual Studio가 설치되어 있으므로 개발 컴퓨터에 설치되어 있습니다. 그러나 필요한 VC ++ 런타임을 사용할 수없는 컴퓨터에 배포하면 위의 오류가 발생합니다.

다음 패키지를 모두 설치하십시오.

Visual Studio 2013 용 Visual C ++ 재배포 가능 패키지-vcredist_x64

Visual Studio 2013 용 Visual C ++ 재배포 가능 패키지-vcredist_x86

Visual Studio 2012 용 Visual C ++ 재배포 가능 패키지-vcredist_x64

Visual Studio 2012 용 Visual C ++ 재배포 가능 패키지-vcredist_x86



0

약간 재미있을 수 있지만 정상적인 작업 코드와 동일한 문제가 있습니다. StreamWriter와 StreamReader를 추가했는데 오류가 발생했습니다. 해결책은 해당 코드를 주석 괄호로 가져간 다음 디버그하고 다시 작동하기 시작했다는 것입니다.



0

내 경우에는이 예외를 던진 dll에서 종속성이 누락되었습니다. Dependency Walker로 확인하고 누락 된 dll을 추가하면 문제가 해결되었습니다.

더 구체적으로, 실수로 SVN 키워드를 추가하여 opencv_core340.dll을 손상 시켰으므로, dll은 더 이상 사용할 수 없습니다. 그러나이 문제에 대한 해결책은 dll이 손상되었는지 여부에 달려 있다고 생각하지 않습니다. 완전한 정보를 제공하기 위해 이것을 추가하고 있습니다.


0

사격! 이 문제에 대해 알고있었습니다. VS 출력 창에서 실수로 'x86'을 볼 때까지 모든 일을 올바르게하고 있다고 생각했는데 그 원인을 파악했습니다. 오늘 몇 분을 낭비했습니다.

'Publish'창 아래의 구성이 'x86'으로 설정되었습니다. 반면 다른 곳에서는 'x64'였습니다.

구성 관리자, 게시 설정, 솔루션 구성 및 IIS 설정 (웹 서버 인 경우)간에 동기화되어 있는지 확인하십시오.

또한 VS는 32 비트 앱이고 IIS는 64 비트입니다. 32 비트 앱은 IIS에서 기본적으로 비활성화되어 있습니다.

여기에 이미지 설명을 입력하십시오


0

다른 답변과 다른 것을 발견했습니다. 내 프로젝트 에서이 예외에 도달하면 컴파일이 손상되었습니다. rebuild 강제로 변경하지 않고 수정되었습니다.


0

나는 같은 문제가 있었다. 필자의 경우 프로젝트 B는 Nuget "Microsoft.Management.Infrastructure"가 설치된 .Net Core Class Library입니다. 오류는 내가 프로젝트 B를 "MI"라고 불렀다는 것입니다. 나는 프로젝트 이름을 다른 것으로 바꾸었고 갑자기 모든 것이 다시 작동했습니다.


-1

내 컴퓨터는 BIOS 업데이트를 보여 주었고 이것이 갑자기이 오류가 발생하는 것과 관련이 있는지 궁금했습니다. 그리고 업데이트를 수행 한 후 오류가 해결되고 솔루션이 제대로 작성되었습니다.


-1

cmd에서 .exe 파일을 실행하려고합니까? 이것은 나의 실수였다. .exe 파일을 두 번 클릭하여 실행하십시오. Windows 8.1 / Windows Server 2012 R2 x64 용 .NET Core SCD 인 경우

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.