Visual Studio에서 "32 비트 선호"설정의 목적은 무엇이며 실제로 어떻게 작동합니까?


204

여기에 이미지 설명을 입력하십시오

컴파일러가 필요할 때 64 비트 용으로 컴파일하는 방법을 자동으로 알 수있는 방법이 확실하지 않습니다. 자신있게 32 비트를 대상으로 할 수있는시기를 어떻게 알 수 있습니까?

컴파일러가 컴파일 할 때 어떤 아키텍처를 대상으로하는지 아는 방법이 궁금합니다. 코드를 분석하고 찾은 내용에 따라 결정을 내립니까?



아 고마워 전에는 보지 못했습니다. 컴파일러가 타겟팅 할 아키텍처를 자동으로 알고있는 방법에 대해서는 여전히 궁금합니다. 어떤 아이디어?
Aaron

답변:


219

Microsoft는 AnyCPU가 실제로 .NET 4.5 및 Visual Studio 11에서 의미 하는 블로그 항목을 가지고 있습니다 .

.NET 4.5 및 Visual Studio 11에서 치즈가 이동되었습니다. 대부분의 .NET 프로젝트의 기본값은 다시 AnyCPU이지만 AnyCPU에는 두 가지 이상의 의미가 있습니다. AnyCPU의 추가 하위 유형 인“모든 CPU 32 비트 기본 설정”이 새로운 기본값입니다 (전체적으로 / platform C # 컴파일러 스위치에는 5 가지 옵션이 있습니다 : x86, Itanium, x64, anycpu 및 anycpu32bitpreferred). ). AnyCPU의 "32 비트 선호"플레이버를 사용할 때의 의미는 다음과 같습니다.

  • 프로세스가 32 비트 Windows 시스템에서 실행되는 경우 32 비트 프로세스로 실행됩니다. IL은 x86 기계 코드로 컴파일됩니다.
  • 프로세스가 64 비트 Windows 시스템에서 실행되면 32 비트 프로세스로 실행됩니다. IL은 x86 기계 코드로 컴파일됩니다.
  • 프로세스가 ARM Windows 시스템에서 실행되면 32 비트 프로세스로 실행됩니다. IL은 ARM 기계 코드로 컴파일됩니다.

"모든 CPU 32 비트 기본 설정"과 "x86"의 차이점은 이것뿐입니다. x86으로 컴파일 된 .NET 응용 프로그램은 ARM Windows 시스템에서 실행되지 않지만 "모든 CPU 32 비트 기본 설정"응용 프로그램은 실행되지 않습니다. 성공적으로 실행됩니다.


12
+1. 또한 "32 비트 선호"확인란은 .NET 4.5 이상 실행 프로젝트에서만 사용할 수 있습니다.
리 그리섬

12
anycpu32bitspreferred의 또 다른 장점은 64 비트로 실행되는 다른 .exe가 해당 어셈블리를로드 할 수 있다는 것입니다.
Bruno Martinez

30
개인적으로 도구를 설정하지 않고 기본 설정으로 설정하는 것이 끔찍하다고 생각합니다. 더 나쁜 것은, 끄지 않으면 csproj 파일에 없기 때문에 검색 할 수 없습니다! 대부분의 사람들이 32 비트 Office를 설치하는 x64 시스템에서 CPUAny와의 Office 자동화 비 호환성으로 인해 추가되었을 수 있습니다.
Dave

6
@BrianDavidBerman, false를 32로 설정하고 64 비트 시스템에서 x64 또는 Any CPU를 설정하면이 있습니다.
Lex Li

6
선호하는 x86과 모든 CPU 32 비트의 차이점은 후자의 경우 큰 주소 플래그가 실행 파일에 설정된다는 것입니다. 이는 64 비트 OS에서 실행되는 32 비트 프로세스가 x86 모드에서 2GB의 메모리를 사용하고 모든 CPU 32 비트 기본 모드에서 4GB의 메모리를 사용할 수 있음을 의미합니다.
Nic

6

간단한 답변은 다음과 같습니다.

응용 프로그램 아치.

참고 : AnyCPU-32bitPreferred는 .Net 버전 4.5 이상에서만 사용할 수 있습니다.


2
"32 비트로 실행"과 "WoW64"로 실행의 차이점은 무엇입니까? WoW64 = "Windows64의 Windows (32 비트)"라고 생각했으며 32 비트 응용 프로그램을 실행하는 데 필요했습니다.
Peter Cordes

이것에 대한 소스가 있습니까? 다른 곳에서도 여전히 기본값은 anycpu32bitpreferred이며, 64 비트 Windows 컴퓨터에서 많은 사람들이 사용하는 사람들과는 큰 차이가 있습니다.
Ran Sagy

@RanSagy는 새 프로젝트를 만들고 확인하여 간단하게 테스트 할 수 Project -> Properties -> Build tab -> Platform target있지만 .... AnyCPU-32bitPreferred.Net 버전 4.5 이상에서만 사용할 수 있습니다. 그래서 기본값은 AnyCPU입니다.
Yousha Aleayoub

어떤 경우에는 광산이 회색으로 표시됩니다. 난 그냥 (정말 MSBuild를 16 이상) .NET 4.5+ 또는 .net 표준 / 코어에서 발생하는 몇 가지 문서가있다 바라고
란 세이지

-1

그 이유는 64 비트 응용 프로그램에서 더 많은 메모리를 사용하지 않으려는 경우입니다. 즉, 애플리케이션이 AnyCPU 인 경우 32 비트로 실행하려고합니다.

더 추가하기 위해 Visual Studio의 설정은 특정 CLR을 대상으로합니다.

Visual Studio는 x86 컴퓨터에 32 비트 버전의 CLR과 64 비트 Windows 컴퓨터에 32 비트 버전 및 해당 64 비트 버전의 CLR을 모두 설치합니다. Visual Studio는 32 비트 응용 프로그램이므로 64 비트 시스템에 설치하면 WOW64에서 실행됩니다.

64 비트 응용 프로그램 ( MSDN ) 문서를 참조하십시오 .


1
나는 그것이 정확하지 않다. 마찬가지로 32 또는 64에 관계없이 .NET 실행 파일은 여전히 ​​프로세스 당 약 2GB로 제한됩니다.
JP Richardson

1
내 답변을 수정했습니다. 그러나 이것이 당신이 찾고있는 것이라면 확실하지 않습니다 :)
페루

2
@Aaron, 컴파일러는 기본적으로 런타임에 플래그를 설정하여 어셈블리를로드 할 수 있는지 (즉, x64 프로세스에로드 할 블록 x86 전용 어셈블리) 플래그를 기반으로 프로세스를 시작하는 방법 (새 EXE의 경우)을 결정합니다. 나는 IL이 두 가지 맛에 대해 동일하다고 생각합니다.
Alexei Levenkov

1
@JPRichardson 네 맞아요. 그러나 .net 4.5에서는 크기를 늘리는 옵션이 있습니다. MSDN
페루

40
@JPRichardson, 32 비트 또는 64 비트 .Net 실행 파일은 프로세스 당 2GB로 제한됨-모든 프로세스 주소 공간의 첫 번째는 OS 레벨 제한 (32 비트 프로세스의 경우 2 / 3 + GB, 64 비트의 경우 훨씬 많음), 32 비트 버전도 가능 실행 파일에 "LargeAddressAware"플래그가 설정된 경우 2GB 이상을 사용하십시오. 내가 아는 유일한 2GB 제한은 Int32 범위 (약 2GB)에 의해 제한되는 배열 / 할당 크기에 관한 것입니다.
Alexei Levenkov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.