문제

.NET 2.0 응용 프로그램은 관리되지 않은 32 비트 DLL을 가져옵니다. 사용자가 응용 프로그램 내에서 대화 상자를 통해 파일을 열면 DLL이로드됩니다 (첫 번째 인터 로프 호출이 발생합니다).

Target Platform "Any"를 통해 ClickOnce를 통해 응용 프로그램을 배포하면 64 비트 Windows의 사용자는 응용 프로그램에서 파일을 열려고 할 때 BADIMAGEFORMATEXCELCEST를 얻습니다 (현재 관리되지 않은 DLL이로드 됨). 나는 이것이 64 비트 프로세스와 32 비트가 관리되지 않는 DLL의 비 적성에 의해 인한 것임을 이해합니다.

x86을 대상 플랫폼으로 사용하여 응용 프로그램을 재배치했습니다. 내가 이해할 수 있듯이 이것은 물린 문제를 해결해야합니다.

하지만

내가 실행할 때 배포 64 비트 시스템에서 X86 용 응용 프로그램에서는 응용 프로그램이 시작되기 직전에 BadImageFormateXception이 발생합니다. 최소 3 개의 64 비트 머신에서 테스트되었습니다. 32 비트 기계에서는 아무런 문제없이 작동합니다.

응용 프로그램을 실행할 때 곧장 vs (또는 직접적으로는 정상적인 빌드가 아니라 ClickOnce를 통해 가지 않음)에서 X86 대상 플랫폼을 사용할 때 64 비트 Windows에 문제가 없습니다. 응용 프로그램이 시작되고 사용자가 파일을로드 할 수 있습니다 - 인터 로프 호출이 성공합니다.

결과없이 2 일 동안 이것을 디버깅하고 있습니다. 다른 컴퓨터에서 시도했습니다. 내가 시도한 컴퓨터 중 하나에서 일관되게 작동하는 것 같습니다. 그러나이 컴퓨터에 영구적으로 액세스 할 수 없습니다.

컴퓨터에 ClickOnce 배포를 한 번 구축했으며 64 비트 기계에서 작동했습니다. 이것은 아마도 100 번의 시도 중 싱글이었다! 아무것도 변경되지 않았으며, 유일한 변경된 변수는 컴퓨터 재시작 직후에 성공적인 빌드를 수행했다는 것입니다.

Windows를 여러 번 청소/재 구축/재시작했습니다. 나는 2008 년 대를 다시 설치했으며 이제는 전체 OS도 도움이되지 않았습니다.


편집 : 방금 하나의 좋은 빌드 (다음 100 개 중 하나)를 얻었고 배포 된 디렉토리를 비교했습니다. 문제의 원인은 ClickOnce가 메인 .Exe의 매니페스트에서 잘못된 대상 플랫폼을 생성한다는 것입니다.

<asmv1:assemblyIdentity name="app.exe" version="1.0.4.18" publicKeyToken=".token here." language="neutral" processorArchitecture="<b>msil</b>" type="win32" />

ProcessorArchitecture는 x86이어야합니다.

따라서 문제는 배포 할 때 매니페스트에서 올바른 프로세스어 구조를 일관되게 강제로 강제하는 방법입니다.

누구든지 제발 도와 줄 수 있습니까?

도움이 되었습니까?

해결책

이는 64 비트 Windows 7에 VS 2008 SP1을 설치하여 해결되었습니다. XP의 VS2008 SP1은 내가 시도한 두 기계에 문제가있었습니다.

다른 팁

VS2008 SP1을 사용 하여이 문제가있었습니다. 제 경우에는 32 비트로 컴파일되어야하는 32 비트 DLL과 동일한 솔루션에서 사용하는 응용 프로그램이있었습니다. X86을 릴리스 빌드의 빌드 대상으로 지정했지만 64 비트 응용 프로그램을 게시했을 때 설치 프로그램에 포함되었습니다. 문제에 대한 약간 잔인한 솔루션을 찾았습니다. 구성 관리자로 이동하여 빌드하려는 구성을 제외하고 가능한 모든 구성을 제거하십시오 (디버그 및 릴리스 버전). 이 작업을 수행 한 후 ClickOnce 설치 프로그램이 올바른 응용 프로그램으로 생성 된 것을 발견했습니다.

나는 이것이 다른 사람에게 도움이되기를 바랍니다. 나는이 문제를 몇 달 동안 쫓아 내고 있습니다.

사용하는 것이 좋습니다 반사기 ClickOnce가 배포 한 기본 EXE를 열고 실수로 64 비트 버전의 DLL 버전을 배포하지 않도록 종속성을 확인하십시오.

IIS 7에서 32 비트 응용 프로그램을 실행하려면 해결해야합니다. http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html

때로는 ClickOnce 게시 프로세스가 이전 CPU 또는 X64 빌드의 이전 파일을 캐시하는 것으로 보입니다. 깨끗하고 재건하는 것은이 문제를 해결하지 못했습니다. 프로젝트에서 모든 빈과 OBJ 폴더를 삭제하고 비주얼 스튜디오를 다시 열어야했습니다.

우리는이 문제를 해결하고 ClickOnce가 배포 한 사용자 프로파일의 하위 디렉토리가 응용 프로그램을 손상시켜야한다고 결정했습니다. 동일한 시스템에서 다른 사용자로 로그인 할 때 ClickOnce로 응용 프로그램을 성공적으로 배포 할 수 있었기 때문입니다.

우리는 단순히 서브 디렉토리를 삭제하여 문제를 해결할 수있었습니다. C:\Users\<user>\AppData\Local\Apps ClickOnce가 응용 프로그램을 배포했던 곳. 우리의 경우, 이것은 그렇습니다 C:\Users\<user>\AppData\Local\Apps\2.0.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top