2010-03-22 5 views
6

VC++ 비 관리 DLL을 사용하는 C# .NET 3.5 콘솔 응용 프로그램에서 일하고 있습니다. 그것은 몇 주 전에 작업했을 때 문제없이 실행되었지만, 오늘 다시 돌아와서 BadImageFormatException을 얻고 있습니다 ("잘못된 형식의 프로그램을로드하려고 시도했습니다. (HRESULT의 예외 : 0x8007000B)).NET 어셈블리에서 BadImageFormatException의 다른 원인은 무엇입니까?

내 개발 워크 스테이션에서 64 비트 Windows 7을 실행하고 있으며 관리되지 않는 코드로 상당한 작업을 수행하므로 .NET 어셈블리와 VC++ 라이브러리에 x86 대상이 모두 있는지 즉시 확인했습니다.

그냥 내가 청소해야하고 아무 소용에 VC++ 라이브러리 및 .NET 어셈블리를 재 구축합니다. 어느 시스템이 특별히 이상한 점이하고있다

을. 벤처 캐피탈 ++ 라이브러리로드 진 날엔 파일을 읽고 수학 내용을 처리합니다. .NET 어셈블리에는 라이브러리 용 DllImports와 일부 코드가 연결되어 있습니다. 이것은 모두 몇 주 전에 일했습니다.

그래서 지금 실행중인 x86/x64 충돌보다 일반적인 BadImageFormatException의 다른 원인이 있는지 궁금하게 생각합니다.

감사합니다.

EDIT : x86 또는 x64 모드에 관계없이 동일한 오류가 발생하지만 'Any CPU'로 설정하면 실행은 그 지점을 지나지 만 나중에 예외없이 VC++ 라이브러리를 호출하면 실행이 중단됩니다. 이 문제와 관련이 있는지 여부에 관계없이 '모든 CPU'가 x86 및 x64와 다르게 수행되면서이 문제에 대해 의견이 분분합니까?

+0

실행중인 응용 프로그램이 x64 버전의 VC++ 라이브러리에 대한 액세스 권한을 갖고 있으며 대신 해당 라이브러리를로드하려고 시도합니까? 또는 실행중인 응용 프로그램이 x86이 아닌 AnyCPU를 대상으로 할 수 있습니까? AnyCPU는 64 비트 환경에있는 경우 64 비트로로드됩니다. – Anzurio

+0

좋은 질문입니다. 전자는 그럴 것 같지 않습니다. 프로젝트를 복사 한 적이없는 다른 컴퓨터에 프로젝트를 복사하려고 시도했습니다. 어셈블리의 x86 버전 만 복사하면됩니다. 다른 컴퓨터에서 같은 문제가 발생했습니다. 응용 프로그램이 x86으로 설정되어 있습니다. 호기심에서 나는 'Any CPU'에서 실행되도록 설정했다. 그렇게하면 VC++ 라이브러리 (x86 또는 x64로 설정되면 종료됩니다)에 대한 첫 번째 호출을 지나치게되지만 나중에 라이브러리 호출시 실행이 종료됩니다. –

+0

.exe에서 종속성 워커 x86을 실행 한 다음 .dll에서 실행하십시오. 64 비트 컴퓨터에서 system32의 msvcr120.dll을 복사 한 후에이 문제가 발생했습니다. 오우! –

답변

3

CLR 2.0 용으로 빌드 된 어셈블리를 CLR 2.0에로드하려고 시도했을 수 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 그러나 여기에는 Visual Studio 2010 설치가 없으므로 CLR 4.0이 필요하지 않습니다. –

2

네이티브 코드의 사용을 감안할 때 여기서 가장 가능성있는 문제는 .NET 어셈블리 인 것처럼 네이티브 DLL을로드하려고 시도한다는 것입니다. 이 시나리오는 BadImageFormatException을 생성합니다.

응용 프로그램을 실행하고 BadImageFormatException에 대해 throw를 중단하고로드중인 DLL을 확인하도록 설정하십시오. 그것이 본래의 것이라면 그것은 문제입니다.

4

이 오류가 발생하면 항상 64 비트 프로세스에서 32 비트 DLL을로드해야합니다.

EXE 파일을 x86으로 컴파일하여 작동하는지 확인하십시오.

+0

초기 질문에서 말했듯이 모든 것이 x86으로 설정됩니다. –

+0

이것은 나를 도와 줬는데, 고마워. – ChaosPandion

+0

저장 시간 + – Xaqron

3

.dll로드 충돌을 확인하십시오!

C#에서 C++/CLI dll을 호출했습니다. C++/CLI 라이브러리는 타사 네이티브 DLL을 래퍼합니다.

밝혀졌습니다. 경로 (libeay32.dll)에 같은 이름의 두 dll이 있습니다. (에서 "다... : \ 프로그램 파일 \ 디버깅 도구"폴더) http://www.microsoft.com/whdc/devtools/debugging/default.mspx

실행 'GFLAGS'문제의 원인을 발견하기 위해

나는 창문 디버깅 도구를 설치하기로 로더 "스냅"디스플레이 사용 가능

> gflags -i <my test app.exe> +sls 

는 CDB (콘솔 디버거) 또는 WinDBG로의 응용 프로그램을 실행하고 예외를 발생하는 DLL을 찾아 출력을 통해 트롤.

> cdb -g <my test app.exe> 

'wrong'라는 이름을 바꾸면 libeay32.dll은 문제를 보여 주지만 일시적인 해결책 일뿐입니다!

어쨌든 동일한 오류 찾기 접근 방식이 도움이 될 수 있습니다.

0

필자의 경우, EXE의 프로젝트 속성의 디버그 탭에서 Enable unmanaged code debugging을 끄면 아이러니하게도 트릭이 수행됩니다.

솔직히 말해서 왜 이것이 문제의 원인인지는 잘 모르겠습니다.

관련 문제