64비트 환경에서netframework의 운영 메커니즘 연구

5960 단어 .netsqlitedll
최근에 쓰고 있습니다.net 애플리케이션에서 일부 플랫폼에서 SQLite DLL을 로드할 수 없는 문제가 발견되었습니다.
증상은 다음과 같습니다.
a. 로컬 Windows 7/8 64bit 개발 환경은 정상적입니다.b. 일부 Windows 7 64bit 사용자의 컴퓨터에서는 System을 로드할 수 없습니다.Data.SQLite.DLL. c. 일부 Windows XP 컴퓨터에서는 DLL을 로드할 수 없습니다.
DLL을 로드할 수 없을 경우 BadImageFormatException 예외가 보고되고 Windows에서 직접 닫혀 예외 정보를 수집할 수 없습니다.이상하게도 현재 디렉터리에 이 DLL 파일이 포함되어 있기 때문에 성공적으로 불러올 수 있어야 합니다.
여러 장면의 조합으로 인해 일시적으로 문제가 어디에서 발생했는지 판단하기 어렵다.처음에 필자는 여러 가지 방법을 시도해 보았지만 본기에서 재현하려 했으나 모두 실패했다.우연한 기회에 필자는 이 기기의 모든 SQLite와 관련된 구성 요소를 삭제하여 문제가 성공적으로 재현되었다.
절망 속에서 약간의 희망이 불타올랐다.SQLite와 관련된 세 가지 구성 요소가 설치되어 있는 것을 발견했습니다.
SQLite-1.0.66.0-setup.exe
sqlite-netFx35-setup-bundle-x64-2008-1.0.82.0.exe
sqlite-netFx35-setup-bundle-x86-2008-1.0.82.0.exe

여러 번 반복해서 다음과 같은 내용을 확인했다.
SQLite-1.0.66.0-setup.exe -    
sqlite-netFx35-setup-bundle-x86-2008-1.0.82.0.exe -    
sqlite-netFx35-setup-bundle-x64-2008-1.0.82.0.exe -   

보아하니 사용자 시스템에 sqlite-netFx35-setup-bundle-x64-2008-1.0.82.0이 없는 것 같다.exe, 그래서 실행에 실패했습니다.자세히 검사한 결과, 이 가방은 시스템 GAC에 64비트 DLL을 설치했고, 이전에 내가 발표한 디렉터리에는 32비트 DLL 파일이 포함되어 있었다.모든 진실이 밝혀져 64비트 버전과 32비트 버전을 분리하여 발표하여 문제를 해결합니다!
여기까지 한숨 돌릴 수 있었을 텐데, 내 마음속에는 여전히 의심이 가득했다.
(1) 64비트 시스템에서 내 것.net 앱은 도대체 32비트예요, 64비트예요?(2) 32비트 애플리케이션은 64비트 시스템에서 정상적으로 작동합니다. 현재 디렉토리의 DLL이 로드되지 않은 이유는 무엇입니까?(3) 왜 이전에 호출된 제3자 DLL은 32/64비트 문제가 발생하지 않았는데 이 DLL만 이렇게 특별합니까?(4) .net에서 DLL을 로드하는 순서는 무엇이며 어떤 것이 우선입니까?
진지한 Google을 통해 이러한 팬덤을 일일이 해결합니다.(1) 64비트 시스템에서net 프로그램은 보통 64비트 프로그램으로 실행됩니다.Wow를 사용할 수 없습니다.64비트 시스템에서 실행되는 32비트 프로그램은 *32 또는 "32비트"로 표시됩니다.
그리고 일이 이렇게 간단한 건 아니에요..net 프로그램에는 현재 다음과 같은 프로세서 구조가 있습니다.
Any CPU(       MSIL  )
x64( 64    ,  AMD64)
x86( 32    )
IA64( IA64    )

앞서 설명한 일반(Any CPU)은 Any CPU를 의미합니다.이 프로그램은 32비트 시스템에서 32비트 모드, 64비트 시스템에서 64비트 모드로 실행됩니다.이때 특정 프로세서로 표시된 것은 상응하는 모드에서만 실행할 수 있다.자세한 내용은 corflags 도구를 사용하여 다음 정보를 볼 수 있습니다.
D:\Lib\x64\>corflags System.Data.SQLite.DLL  
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  2.0.50727.42  
Copyright (c) Microsoft Corporation.  All rights reserved.  
  
Version   : v2.0.50727  
CLR Header: 2.5  
PE        : PE32+  
CorFlags  : 24  
ILONLY    : 0  
32BIT     : 0  
Signed    : 1 
D:\Lib\x86\>corflags System.Data.SQLite.DLL  
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  2.0.50727.42  
Copyright (c) Microsoft Corporation.  All rights reserved.  
  
Version   : v2.0.50727  
CLR Header: 2.5  
PE        : PE32  
CorFlags  : 24  
ILONLY    : 0  
32BIT     : 0  
Signed    : 1

ILONLY: 이미지에 IL 코드만 포함되어 있는지 여부.1은 순수 IL 코드를, 0은 Native 코드를 나타냅니다.32BIT: 단순 IL 코드라도 32비트와 64비트 환경에서 실행하는 것은 다르다.이 표시는 x86과 Any CPU를 구분하는 데 사용됩니다.PE: 32비트는 PE32, 64비트는 PE32+입니다.이것은 32비트와 64비트 이미지를 구분하는 데 사용됩니다.
Any CPU:PE = PE32  and 32BIT = 0
x86:    PE = PE32  and 32BIT = 1
x64:    PE = PE32+ and 32BIT = 0

이전에 64비트 프로세스에서 로드하려고 했던 32비트 DLL의 ILONLY=0, 즉 플랫폼 관련 코드가 포함되어 있어서 로드할 수 없어 오류가 발생했습니다.[주: 현상 추측을 통해.net Framework 코드를 추적하여 증명해야 함] (2) 이 문제는 상술한 분석을 통해 이미 잘 알고 있다.64비트 DLL을 우회하는 데 따른 문제를 해결하려면 마스터 프로그램도 Any CPU 대신 x86으로 컴파일하면 64비트 시스템에서 실행할 수 있습니다.이 경우 운영 체제에서 Wow 모드를 사용하여 프로세스를 시작합니다.(3) 이 SQLite의 DLL은 IL과 Native 코드를 혼합하여 플랫폼 호출에 엄격하게 대응해야 한다.(4) .net에서 프로그램 집합을 불러오는 순서: 1. GAC(Global Assembly Cache)에서 해당 버전의 DLL을 검색한다.2. 프로필(web.config 또는 app.config);3. 응용 프로그램(.exe)의 현재 디렉터리 아래;그러나 사실상 이 순서보다 더 복잡할 수도 있다.http://msdn.microsoft.com/en-us/library/aa720133.aspx참고 문헌이전에 제 개발 환경에서 로컬 GAC에 정확한 x64버전이 포함되어 있기 때문에 정확하게 실행할 수 있습니다.다른 사람의 64개의 기계에 복사했을 때 문제가 생겼다.일부 XP 시스템에는 잘못된 이터레이션이 설치되어 있어 로드에 실패하는 경우도 있습니다.마지막으로 GAC의 위치:\Windows\assembly에 대해 설명합니다."내 컴퓨터"로 이 디렉터리를 열 때 보이는 것은 모두다.net 전역 프로그램 집합의 목록입니다. 이것은 Windows 특수 처리의 결과입니다.명령줄을 통해서만 이 디렉터리에서 GAC 로 나뉘어진 것을 볼 수 있습니다.32, GAC_64, GAC_MSIL 등 여러 하위 디렉토리이 디렉토리는 앞에서 설명한 여러 프로세서 아키텍처의 DLL입니다.보충: 이전 [c]의 문제 해결 방안: 나중에 발견, 시스템.Data.SQLite.DLL 버전 1.0.66은 작동하지만 일부 Windows XP에서는 1.0.82가 작동하지 않습니다.공식 사이트에서 1.0.82에 대한 설명은 대부분이 x86과 x64의 차이에 주목했기 때문에 나는 한때는 여전히 프로세서 구조가 일으킨 것이라고 생각했다.마지막으로 depends 도구를 통해 보니 1.0.82 버전의 DLL이 MSVCR90을 인용하였습니다.DLL.문제가 발생한 컴퓨터에 VC2008 런타임이 설치되어 있지 않으면 DLL을 찾을 수 없습니다.두 가지 해결 방법: 버전 1.0.66을 사용하거나 XP에 VC2008 실행 팩을 설치하는 방법:http://www.microsoft.com/zh-cn/download/details.aspx?id=29이전에 64비트 플랫폼 응용에 대한 이해가 제한되어 있었기 때문에 글의 많은 내용은 실험을 통해 Microsoft의 공식 설명과 일치하지 않거나 잘못된 부분이 있을 수 있음을 추측했다.여러분의 지적을 환영합니다!
참조 자료:
1、
http://msdn.microsoft.com/en-us/magazine/dd727509.aspx
2、
http://blogs.msdn.com/b/gauravseth/archive/2006/03/07/545104.aspx
3、
http://blogs.msdn.com/b/junfeng/archive/2004/08/11/212555.aspx
4、
http://blogs.msdn.com/b/junfeng/archive/2004/09/12/228635.aspx
5、
http://blog.csdn.net/cstod/article/details/4887049
6、
http://stackoverflow.com/questions/6507675/gac-32bit-vs-64bit
7、
http://blog.csdn.net/wangjunhe/article/details/6692194

좋은 웹페이지 즐겨찾기