programing

플랫폼이 동일한 경우에도 "잘못된 형식의 프로그램을 로드하려고 했습니다."

linuxpc 2023. 5. 1. 20:01
반응형

플랫폼이 동일한 경우에도 "잘못된 형식의 프로그램을 로드하려고 했습니다."

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

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

처음에는 프로젝트를 Any CPU 플랫폼으로 설정하여 둘 다 x86으로 변경했지만, 이 오류는 여전히 발생하고 있습니다.그것이 제가 아는 유일한 해결책입니다.

DLL은 손상되거나 손상되지 않았습니다. 원본이 없는 다른 프로그램과 함께 사용할 수 있기 때문입니다.저는 아마도 의존관계를 찾는 것이 아니라고 생각했지만, 제가 확인해보니 모두 거기에 있었습니다.게다가, 그것은 그것을 던지지 않을까요?DllNotFoundException그런 경우에?

제가 뭘 더 할 수 있을까요?그리고 "대신 64비트 관리되지 않는 DLL을 사용하십시오."라고 말하기 전에 DLL이 없다는 것을 알려드리겠습니다.;)

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

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

여기에 이미지 설명 입력

어찌된 일인지 Configuration Manager(구성 관리자)의 Build(구축) 확인란이 선택 해제되어 있어서 이전 Any CPU 빌드로 실행되고 있었습니다.수정한 후 Visual Studio에서 어셈블리를 디버그할 수 없다고 불평했지만 다시 시작하여 수정되었습니다.

Visual Studio에서 프로젝트를 마우스 오른쪽 단추로 클릭 -> 왼쪽 창에서 빌드 탭을 클릭합니다.

프로젝트 특성, 빌드 탭

Platform Target에서 x86(또는 더 일반적으로 링크 중인 라이브러리와 일치하는 아키텍처)을 선택합니다.

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

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

: Tools > Options > Projects and Solutions > Web Projects > 64bit 버전의 IIS Express로 이동합니다.

또는 Project Properties > Web > Bitness에서 프로젝트별로 수행할 수 있습니다.

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

저는 그것을 고쳐준 다른 확인할 것을 찾았습니다.Visual Studio에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 "속성"을 엽니다."Compile"(또는 "Build") 탭을 클릭한 후 하단의 "Advanced Compile Options"를 클릭합니다.

드롭다운 "Target CPU"를 선택합니다.작성 중인 "플랫폼"과 일치해야 합니다.즉, "모든 CPU"를 구축하는 경우 "대상 CPU"는 "모든 CPU"로 표시되어야 합니다.모든 플랫폼을 활성화하고 이 설정을 확인합니다.

임의 CPU를 사용하는 경우 32비트 기본 설정 옵션을 선택하면 다음과 같은 문제가 발생할 수 있습니다.

프로젝트 속성의 빌드 탭에서 이 옵션을 선택 취소해야 합니다!

여기에 이미지 설명 입력

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

  1. 이동: 도구 → 옵션 → 프로젝트 및 솔루션 → 웹 프로젝트 → 64비트 버전의 IIS Express를 사용합니다.
  2. 웹 서비스 프로젝트에 대한 아래 설정 변경:

여기에 이미지 설명 입력

이 게시물에 대한 주제는 조금 다르지만, 이 오류 메시지를 검색하는 것이 저를 여기로 데려왔습니다.

팀 시스템을 통해 빌드할 때 이 오류가 발생하는 경우 빌드 정의 프로세스 탭에는 "MS 빌드 플랫폼" 설정이 있습니다.이 옵션을 "자동"으로 설정하면 이 문제가 발생할 수 있습니다.또한 "X86"으로 변경하면 오류가 해결됩니다.

우리도 비슷한 문제가 있었는데 플랫폼 대상을 x86으로 설정하여 해결할 수 있었습니다.프로젝트 속성 -> 빌드

Visual Studio 2019에서 테스트(VS에서 직접 MST 테스트)를 실행하려고 할 때도 비슷한 문제가 있었습니다.저의 경우 x64 네이티브 DLL만 가지고 있었는데 이 오류 메시지를 받았습니다.먼저 Visual Studio가 x86으로 실행되기 때문이라고 생각했지만 이 페이지는 문제를 해결하는 데 도움이 되었습니다.

64비트 프로세스로 장치 테스트 실행

라고 써있습니다

  1. 모든 CPU로 프로젝트 설정
  2. 프로세서 아키텍처를 명시적으로 정의

저는 두 가지를 모두 했고 (명시적으로 x64를 설정했습니다) 그리고 나서 제 테스트가 작동하기 시작했습니다.

프로세서 아키텍처를 x64로 명시적으로 설정

저의 경우는 파일의 내용이 잘못되었습니다.웹에서 DLL을 다운로드했지만 DLL의 내용이 HTML 페이지:D 이진 파일인지 확인해 보십시오. DLL이 올바른 것 같으면 :)

@paibamboo의 답을 기반으로 구축

그는 말했습니다.: Tools > Options > Projects and Solutions > Web Projects > 64bit 버전의 IIS Express로 이동합니다.

제 동료는 이 상자를 확인했지만(그는 분명히 찾아보았다), 문제의 오류 메시지가 있었습니다.몇 시간 후에 그는 상자의 체크를 취소하고 다시 확인했습니다.로앤 보시오.이제 코드가 성공적으로 실행되었습니다.

이 상자의 상태가 저장된 두 곳이 동기화되지 않은 것 같습니다.다시 확인해보니 동기화가 되었습니다.

더 많은 지식을 갖춘 사용자를 위한 질문:지난 주 (VS 2015에 대한) 업데이트나 어떤 것이 주들의 동기화를 해제했습니까?

저도 같은 문제를 해결한 답을 보세요.

2010년 12월 5일 오전 8시 50분에 Luis Mack에 의해 게시된 64비트 시스템에서 컴파일할 때 특정 프로젝트에 대해서만 동일한 문제를 발견했습니다.사용자 컨트롤이나 양식을 디자이너에서 편집할 때마다 이미지 스트림에서 하나의 문자를 수동으로 변경하는 것이 효과적인 해결책으로 보입니다.

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

로 변경

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

저것은 00LjAu입니다.MC4w 다시 0yLjAu로 이동라인 끝에 MC4w(00에서 0y로 되돌림)

제 경우에는 Reflection을 통해 참조된 DLL을 다시 로드하는 작은 .exe를 사용하고 있습니다.그래서 저는 하루를 절약할 수 있는 다음과 같은 단계를 수행합니다.

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

저의 경우 MSTest를 통해 테스트를 실행하다가 32비트 및 64비트 DLL을 모두 테스트 디렉토리에 배포하고 있다는 것을 알게 되었습니다.프로그램에서 64비트 DLL을 선호하여 실패를 초래했습니다.

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

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

CallingConvention = CallingConvention.Cdecl 

DLL 가져오기 방법에 있습니다.

저는 이 문제를 'Windows' 방식으로 해결했습니다.모든 설정을 확인하고 솔루션을 정리한 후 재구축한 후 솔루션을 닫고 다시 엽니다.그 다음에는 효과가 있어서 VS가 청소하는 동안 몇 가지 물건을 치우지 않았을 것입니다.논리적 해결책이 작동하지 않을 때, 저는 대개 비논리적인(또는 비논리적으로 보이는) 해결책으로 눈을 돌립니다.Windows(윈도우)는 저를 실망시키지 않습니다.:)

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

어떻게 되는지 보려고 .exe를 두 번 클릭했더니 4.5를 설치하라는 메시지가 표시되었습니다.

그래서 4.0으로 다운그레이드를 했는데 성공했습니다!

버전이 일치하는지 확인합니다.내 개발 상자에서 정상적으로 실행되었지만 서버가 더 오래되었습니다.NET 버전.

에서 같은 문제를 겪고 있었습니다.NET 코어.해결책은 32비트 .netcore 런타임을 다운로드하고 프로젝트 대상을 지정하는 것이었습니다.x86

당신의csproj파일 추가

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

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

이것은 Windows 컴퓨터에 사용되었으므로 Linux/OSX에 대한 경로 등을 조정해야 합니다.

저의 경우, 창업 프로젝트로 정확한 프로젝트가 설정되어 있지 않았습니다.솔루션 설정으로 이동하여 올바른 시작 프로젝트를 선택했더니 작동했습니다.

저의 경우에도 게시 후 동일한 오류가 발생했습니다.이전에 다른 플랫폼 구성으로 게시한 적이 있습니다.

해결책은 먼저 게시 폴더를 정리한 다음 작동하는 것이었습니다.

(또는 "기존 파일 삭제" 옵션을 true로 설정)

이 예외를 발생시킬 수 있는 또 다른 이유는 DLL의 대상 플랫폼에 대한 C++ 재배포 테이블이 없기 때문입니다.VM에서 테스트할 때 어려움을 겪었습니다.

.net core의 경우 Ijwhost.dll이 출력 디렉터리에 있는지 확인합니다. 때때로 복사되지 않고 오류가 발생합니다.https://github.com/dotnet/runtime/issues/38231 및 https://stackoverflow.com/a/58773266/9665729 참조하십시오.

또한 사용 중인 사용된 dll 파일("WebView2Loader.dll"의 경우)의 버전이 매우 중요합니다.저도 "마이크로소프트"와 거의 같은 문제를 겪었습니다.WebView2.MMC Snap-Ins에서 WebView2 구성 요소를 "HTMLView" 또는 "FormView" 유형과 함께 사용하려고 할 때 FixedVersionRuntime.101.0.1210.39.x64".

참조된 dll 파일을 프로젝트에 액세스할 수 있는 적절한 경로에 복사했습니다(프로젝트 출력 파일 옆에 놓아서 테스트할 수 있습니다). 그러면 WebView2 브라우저가 예상대로 작동하기 시작했습니다.Microsoft 오류 메시지는 (적어도 제 경우에는) 약간 오해를 불러일으키기도 했고, 요점 정보를 충분히 전달하지 못했습니다.

플랫폼 대상을 혼합하거나(예: x86용으로 컴파일된 응용 프로그램에서 X64로 컴파일된 dll 파일을 사용하거나) 네이티브 코드와 를 혼합할 때 일반적으로 발생하는 "BadImageFormatException"을 받았습니다.NET 하지만 그것은 전혀 제 문제가 아니었습니다.나는 이것이 방해받지 않는 사람에게 도움이 되기를 바랍니다.

C#/WPA에서 네이티브 DLL을 호출할 때도 이 문제가 발생했습니다.아래 단계는 제 프로젝트에 적용됩니다.속성 ->빌드 ->플랫폼 대상 x64/x86(이 옵션을 변경하면 작동함).

언급URL : https://stackoverflow.com/questions/2023766/an-attempt-was-made-to-load-a-program-with-an-incorrect-format-even-when-the-p

반응형