플랫폼이 동일하더라도 "잘못된 형식의 프로그램을로드하려고했습니다"


461

64 비트 시스템의 32 비트 관리되지 않는 DLL에서 함수를 호출하고 있습니다. 내가 얻는 것은 :

BadImageFormatException : 형식이 잘못된 프로그램을로드하려고했습니다. (HRESULT 예외 : 0x8007000B)

처음에는 프로젝트를 Any CPU 플랫폼으로 설정했기 때문에 둘 다 x86으로 변경했지만이 오류는 여전히 발생합니다. 이것이 내가 아는 유일한 해결책입니다.

DLL은 다른 프로그램 (소스가없는)과 함께 사용할 수 있기 때문에 손상되지 않았습니다. 나는 그것이 의존성을 찾지 못하고 있다고 생각했지만 확인하고 모두 거기에 있습니다. 게다가, DllNotFoundException그 경우에 던지지 않습니까?

다른 무엇을 할 수 있습니까? 그리고 "64 비트 관리되지 않는 DLL을 대신 사용하십시오"라고 말하기 전에, 하나도없는 것을 지적하겠습니다. ;)


1
x86으로 어떤 프로젝트를 변경 했습니까? 디버거를 통해 또는 수동으로 예외가 발생하면 어떻게 실행합니까? 후자 인 경우 x86으로 변경했을 때 bin \ 디렉토리에 새 폴더가 있다는 것을 알았습니까? 기본적으로 파일의 bin \ x86 \ Debug입니다.
Lasse V. Karlsen 2019 년

실행 파일이 32 비트 모드 (프로세스 관리자에서 * 32)로 실행 중인지 확인할 수 있습니까?
JP Alioto

@ Lasse V. Karlsen : 예, 각 프로젝트에서 플랫폼을 변경할 때 출력 경로에서 x86 비트를 제거했습니다. 첫 번째 프로젝트는 관리되지 않는 DLL의 함수를 래핑하는 DLL입니다. 두 번째 프로젝트는 첫 번째 DLL에서 래퍼를 사용하는 실행 파일입니다. 둘 다 x86으로 설정되어 있습니다.
David Brown

@JP : 실제로 프로세스 관리자는 32 비트 프로세스로 실행중인 것으로 표시하지 않습니다. 왜 그런 겁니까?
David Brown

답변:


531

IIS 7 (및 / 또는 64 비트 OS 시스템)에서 32 비트 응용 프로그램을 실행하려고하면 동일한 오류가 발생합니다. 따라서 IIS 7에서 응용 프로그램의 응용 프로그램 풀을 마우스 오른쪽 단추로 클릭하고 "고급 설정"으로 이동하여 "32 비트 응용 프로그램 사용"을 "TRUE"로 변경하십시오.

웹 사이트를 다시 시작하면 작동합니다.

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


1
오, 내가 대답했을 때 여분의 IIS 구성 요소를 설치하는 것에 대해 낚시를하고있는 날 ... 누구 든지이 옵션을 선택하면 단점을 제안 할 수 있습니까?
notidaho

3
이것에 관한 성능 문제에 대한 좋은 토론이 있습니다 : stackoverflow.com/questions/507820/…
Ben Power

SharpSvn에 문제가 있는데 도움이되지 않습니다. :(이 어셈블리에서 Sth는 매우 잘못되었습니다.
user2173353

4
이 대답은 저에게 wtf입니다. 질문에는 IIS가 전혀 언급되어 있지 않기 때문입니다!
kristianp

129

어떻게 든 구성 관리자 의 빌드 확인란이 실행 파일에 대해 선택되지 않았으므로 여전히 이전 Any CPU 빌드로 실행 중이었습니다. 내가 고친 후에 Visual Studio는 어셈블리를 디버깅 할 수 없지만 다시 시작하여 수정되었다고 불평했습니다.


고마워 이것은 나도 얻었다. Configuration Manager에서 빌드를 확인했으며 이제 작동합니다 (WPF 데스크탑 응용 프로그램).
danglund

1
위의 모든 작업을 수행하고 플랫폼 설정을 확인하고 구성 설정을 작성하고 솔루션을 정리했지만 여전히 작동하지 않는 경우 DLL의 모든 인스턴스를 검색하여 삭제하십시오.
Will Calderwood

VS 2015에서는 여전히 유효합니다-다시 시작할 필요는 없지만 :)
increddibelly

그게 다야! Configuration Manager 설정을 다시 방문하십시오.
AndyUK

74

에서 비주얼 스튜디오 , 오른쪽 클릭 프로젝트 -> 왼쪽 창에서 클릭 빌드 탭을,

프로젝트 속성, 빌드 탭

아래 플랫폼 대상 86 선택 (또는 더 일반적으로 아키텍처는 당신이 연결되어있는 라이브러리와 일치)

프로젝트 속성, 플랫폼 대상

나는 이것이 누군가를 돕기를 바랍니다! :)


2
VS2013 에서이 문제가 해결되었습니다. 대체 수정은 "플랫폼 대상"을 "모든 CPU"로 남겨두고 "32 비트 선호"확인란을 선택하는 것입니다.
user1069816

2
"32 비트 선호"확인란을 선택하려면 .NET 4.5 이상을 사용해야하지만
user1069816

1
예, 그러나 'Any CPU'의 프로젝트를 'x64'로 변환했습니다. 내 32 비트 프로젝트는 정상적으로 작동하지만 64 비트로 변환 된 동일한 코드는 32 비트로 제대로 작동하지 않습니다. 적절한 64 비트 변환 프로세스를 제공해 주시겠습니까?
Ismayil S

@IsmayilS는 여러분이 연결하는 라이브러리의 64 비트 버전을 사용하고 있는지 확인하십시오
Marvin Thobejane

53

방금이 문제가있었습니다. 여기에있는 모든 제안을 시도했지만 도움이되지 않았습니다.

나는 그것을 고쳐주는 또 다른 것을 발견했다. Visual Studio에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 "속성"을 엽니 다. "컴파일"(또는 "빌드") 탭을 클릭 한 다음 하단의 "고급 컴파일 옵션"을 클릭하십시오.

"타겟 CPU"드롭 다운을 확인하십시오. 빌드중인 "플랫폼"과 일치해야합니다. 즉, "Any CPU"를 구축하는 경우 "Target CPU"는 "Any CPU"라고 표시해야합니다. 활성화하여 모든 플랫폼을 살펴보고이 설정을 확인하십시오.


2
그리고 컴파일러를 사용하는 사람들은 컴파일러 플래그에 "/ platform : x86"을 추가했습니다.
Urchin

이것은 나를 위해 그것을 고쳤다. "빌드"탭에서 "플랫폼 대상"을 조정해야했습니다.
Jowen

64 비트 인 경우 "32 비트 선호"플래그도 확인하십시오. 나는 그것을 위해 그것을 비활성화해야했다.
N4ppeL

51

녹색 화살표 버튼을 클릭하여 응용 프로그램을 실행할 때이 오류가 발생하지만 여전히 64 비트로 응용 프로그램을 실행하려고합니다. VS 2013, 2015, 2017 및 2019 에서이 작업을 수행 할 수 있습니다

도구> 옵션> 프로젝트 및 솔루션> 웹 프로젝트> 64 비트 버전의 IIS Express 사용으로 이동하십시오.


3
감사. 나는 너무 많은 시도를했지만 아무것도 도움이되지 않았습니다. 당신은 내 생명의 은인입니다. 64 비트 OS를 가지고 있으며 64 비트 Visual Studio를 설치했습니다. [알 수없는 이유로 32 비트로 실행됩니다] 플랫폼 대상을 x64에 넣으면 BadImageFormatException 오류가 발생했습니다. 당신의 수정으로 작동했습니다. 나는 당신에게 공감대를 주었다. 당신은 바위
SKCS Kamal

내가 도와 줄 수있어 기쁘다 :)
paibamboo

이것이 내가 필요한 대답입니다. 고마워요!
yushulx

고마워, 이것은 문제를 해결했다. Visual Studio 2017 32 비트 프로세스와 잘 작동합니다.
samir105

1
여전히 VS 2019에서 작동합니다. 감사합니다.
Jake Gaston

36

모든 CPU를 사용하는 경우 32 비트 선호 옵션을 선택 하면이 문제가 발생할 수 있습니다 .

당신을 확인 프로젝트 속성의 빌드 탭 에서이 옵션의 선택 해제 하십시오!

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


3
Visual Studio에서이 옵션을 찾을 위치를 표시 할 수 있으면 도움이됩니다.
trysis

@trysis,이 옵션은 프로젝트 설정 창의 빌드 페이지에 있습니다.
Drew Noakes

1
나는 그것을 넣는 것이 도움이 될 것이라고 말했습니다.
trysis

이 양식을받는 경로는 무엇입니까? 나는 그것을 찾을 수 없습니다
아돌 포 코레아

Visual Studio에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 '속성'을 선택하십시오.
Drew Noakes

8

이 게시물에 대한 주제가 조금 있지만이 오류 메시지를 검색하면 여기로 이동했습니다.

팀 시스템을 통해 빌드하고이 오류가 발생하면 빌드 정의 프로세스 탭에 "MSBuild 플랫폼"설정이 있습니다. 이것이 "자동"으로 설정되어 있으면이 문제가 발생할 수 있습니다. "X86"으로 변경하면 오류를 해결할 수도 있습니다.


이것은 내가 겪었던 것에 가장 가까운 대답입니다. 나는 x86이어야하는 dll을 가지고있었습니다. 다른 프로젝트 (기본적으로 AnyCPU)에서 사용했습니다. 그들은 단지 일치해야합니다. 이 경우 별 차이가 없었으므로 새 프로젝트를 x86으로 변경했습니다.
greg

8

필자의 경우 C #에서 네이티브 DLL을 사용하고있었습니다. 이 DLL은 누락 된 다른 DLL 몇 개에 의존했습니다. 다른 DLL이 추가되면 모든 것이 작동했습니다.


4

@paibamboo의 답변을 바탕으로

그는 말했다 : 도구> 옵션> 프로젝트 및 솔루션> 웹 프로젝트> 64 비트 버전의 IIS Express 사용

동료가이 확인란을 선택했지만 (명시 적으로 찾음) 오류 메시지가 표시되었습니다. 몇 시간 후 그는 박스의 체크를 해제하고 다시 체크했다. Lo and 보라 : 이제 코드가 성공적으로 실행되었습니다.

이 상자의 상태가 저장되지 않은 두 곳이 동기화되지 않은 것으로 보입니다. 다시 확인한 후 다시 동기화했습니다.

더 많은 지식이있는 사용자를위한 질문 : 상태를 동기화 해제 한 업데이트 또는 지난 주 (VS 2015)가 있습니까?


3

또한 이 대답을 참조하십시오. 이것은 저에게 동일한 문제를 해결했습니다.

2010 년 5 월 12 일 오전 8시 50 분에 Luis Mack에 의해 게시 됨 64 비트 컴퓨터에서 컴파일 할 때 특정 프로젝트에 대해서만 동일한 문제가 발견되었습니다. SEEMS가 작동하는 수정은 사용자 컨트롤 또는 양식이 디자이너에서 편집 될 때마다 이미지 스트림에서 한 문자를 수동으로 변경하는 것입니다.

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

로 변경

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

줄 끝에서 00LjAuMC4w0y로 돌아갑니다. ( 00y0y로 돌아 갑니다)


1
링크의 간단한 요약은 @Shaul에 도움이 될 것입니다 :)
Marvin Thobejane

웅대합니다. 감사합니다, 브리핑은 귀하의 의견에 내용을 추가합니다
Marvin Thobejane

2

필자의 경우 Reflection을 통해 참조 된 DLL을 다시로드하는 작은 .exe를 사용하고 있습니다. 그래서 나는 단지 하루를 절약하는 다음 단계를 수행합니다.

솔루션 탐색기의 프로젝트 속성에서 빌드 탭의 x86에서 대상 플랫폼을 선택합니다.


2

필자의 경우 MSTest를 통해 테스트를 실행하고 테스트 디렉토리에 32 비트 및 64 비트 DLL을 모두 배포하고 있음을 알았습니다. 프로그램이 64 비트 DLL을 선호하여 실패했습니다.

TL; DR 테스트에는 32 비트 DLL 만 배포해야합니다.


2

비슷한 문제가 있었고 Platform 대상을 x86으로 설정하여 문제를 해결할 수있었습니다. 프로젝트 속성-> 빌드


x86 dll이 x64와 다른가요? 참조 된 dll 파일에서 이것을 감지하는 방법이 있습니까?
NoBugs 19

@NoBugs 당신이 할 수있는 것 같습니다. 이 글을
Joe

1

이 문제는 'Windows'방식으로 해결되었습니다. 모든 설정을 확인하고 솔루션을 청소 한 후 다시 빌드 한 후 솔루션을 닫고 다시 열었습니다. 그런 다음 VS가 청소 중에 일부 물건을 제거하지 않았을 것입니다. 논리적 인 해결책이 효과가 없을 때 나는 보통 비논리적 (또는 비논리적 인) 것으로 바뀐다. Windows는 나를 실망시키지 않습니다. :)


1

빌드 버전을 서버의 .NET 버전과 일치시켜이 문제를 해결할 수있었습니다.

.exe를 두 번 클릭하여 발생하는 상황을 확인하고 4.5 ...를 설치하라는 메시지를 표시했습니다.

그래서 4.0으로 다운 그레이드하고 작동했습니다!

따라서 버전이 일치하는지 확인하십시오. 내 dev 상자에서 정상적으로 실행되었지만 서버에는 이전 .NET 버전이 있습니다.


1

내 경우에는 파일의 내용이 잘못되었습니다. DLL은 웹에서 다운로드되었지만 DLL의 내용은 HTML 페이지였습니다 .D 올바른 DLL처럼 보이는 경우 이진 파일인지 확인하십시오. :)


1

.NET 코어에서 동일한 문제가 발생했습니다. 해결책은 32 비트 .netcore 런타임을 다운로드하고 프로젝트를 대상으로하는 것입니다.x86

당신에 csproj파일 추가

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

이것은 Windows 시스템에 사용되었으며 Linux / OSX에 대한 경로 등을 조정해야합니다.


0

관리되지 않는 DLL을 가져 오는 경우

CallingConvention = CallingConvention.Cdecl 

DLL 가져 오기 방법에서.


0

1 : 도구> 옵션> 프로젝트 및 솔루션> 웹 프로젝트> 64 비트 버전의 IIS Express 사용 2 : 웹 서비스 프로젝트에 대한 아래 설정 변경으로 이동하십시오. 여기에 이미지 설명을 입력하십시오

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