2015-01-07 9 views
2

이전에 묻지 않았는지 확실하지 않습니다 (찾을 수 없습니다). 나는 간단한 콘솔 앱/ESE를 가지고 있으며 아래 설정을 가지고 있습니다.플랫폼 구축 대상 AnyCPU EXE는 여전히 64 비트 시스템에 32 비트 헤더를 표시합니다

enter image description here

나는 윈도우 8 실행 해요, 63bit의 OS. 그리고 EXE 대상 프레임 워크 .NET 4.5 그러나이 EXE를 컴파일하면 여전히 32 비트 EXE로 표시됩니다. 이 "모든 CPU가"이기 때문에

enter image description here

, 나는 EXE가 64 비트/PE32의 +로 컴파일 기대.

일부 사람들이 이것이 여전히 32 비트가되는 이유를 설명해 주실 수 있습니까?

답변

7

나는 CorFlags을 오해하고 있다고 생각합니다. 여기 CorFlags 진리표는 다음과 같습니다 당신이 볼 수 있듯이 당신이 Any CPU으로 64 비트로 컴파일하지 않을 경우

CPU Architecture   PE  32BITREQ 32BITPREF 
------------------------ ----- -------- --------- 
x86 (32-bit)    PE32   1   0 
x64 (64-bit)    PE32+   0   0 
Any CPU     PE32   0   0 
Any CPU 32-Bit Preferred PE32   0   1 

, 그것은 단지 PE32+를보고합니다. 이유는 헤더가 이전 버전과 호환되어야하기 때문입니다. 즉, 어셈블리가 32 비트와 64 비트 모두 'Any CPU'에서 작동하려면 헤더 형식이 32 비트 운영 체제에서 인식 할 수있는 형식이어야합니다. PE32+은 64 비트 전용 헤더 형식이며 해당 헤더가 Any CPU으로 컴파일 된 어셈블리에 적용된 경우 32 비트 운영 체제는 PE32+ 헤더 형식을 인식하지 못합니다.

+0

그건 의미가 있습니다. 고마워요! – Spock

2

exe ​​파일에는 32 비트 또는 64 비트 코드가 포함되어 있지 않으며 IL 코드 만 포함되어 있습니다.

JIT 컴파일러는 IL 코드에서 기계 코드를 작성하며 플랫폼 대상은 JIT 컴파일러가 작성할 수있는 기계 코드의 종류를 판별합니다.

+0

감사합니다. "Platform target"이 JIT 컴파일러가 생성해야하는 머신 코드의 종류를 결정하는 경우 AnyCPU이기 때문에 64 비트 여야합니까? – Spock

+0

@ 스팍 : 32 비트 시스템에서 32 비트 코드를 생성 할 수 있어야하기 때문에 AnyCPU 용으로 64 비트 일 수는 없습니다. – Guffa