[.net] Visual Studio“Any CPU”대상은 무엇을 의미합니까?

Visual Studio 2008의 .NET 플랫폼 빌드 옵션과 관련하여 혼란이 있습니다.

“모든 CPU”컴파일 대상은 무엇이며 어떤 종류의 파일을 생성합니까? 이 “Any CPU”빌드의 출력 실행 파일을 조사한 결과 x86 실행 파일입니다 (누군가는 보이지 않을 것입니다). 따라서 실행 파일을 x86으로 타겟팅하는 것과 “모든 CPU”를 타겟팅하는 것에는 어떤 차이가 있습니까?

내가 주목 한 또 다른 것은 관리되는 C ++ 프로젝트에는이 플랫폼이 옵션으로 없다는 것입니다. 왜 그런 겁니까? 이것이 일반 32 비트 실행 파일 인 “모든 CPU”실행 파일에 대한 나의 의심이 옳다는 것을 의미합니까?



답변

anycpu를는 64 비트 프로세스에로드 할 때, 32 비트는 32 비트 프로세스에로드 조립체 때 64 비트 코드 JIT 것이다.

CPU를 제한하면 다음과 같이 말할 수 있습니다 .


답변

나는 대부분의 중요한 것들이 언급되었다고 생각하지만 한 가지만 추가 할 것이라고 생각했습니다. 모든 CPU 로 컴파일 하고 x64 플랫폼에서 실행하면 32 비트 DLL 파일을로드 할 수 없습니다. 응용 프로그램이 WoW64 에서 시작되지 않았기 때문에 해당 DLL 파일을 거기서 실행해야합니다.

x86으로 컴파일하면 x64 시스템이 WoW64에서 응용 프로그램을 실행하며 32 비트 DLL 파일을로드 할 수 있습니다.

따라서 어느 환경에서든 종속성을 실행할 수 있으면 “Any CPU”를 선택해야하지만 32 비트 종속성이있는 경우 x86을 선택해야합니다. Microsoft 의이 기사는 이것을 약간 설명합니다.

/ CLRIMAGETYPE (CLR 이미지 유형 지정)

덧붙여, 이 다른 Microsoft 설명서 는 x86이 일반적으로 더 이식성이 좋은 선택이라는 데 동의합니다.

거의 모든 장치에서 실행되므로 x86을 선택하는 것이 일반적으로 앱 패키지에 가장 안전한 구성입니다. 일부 장치에서는 x86 구성의 앱 패키지 (예 : Xbox 또는 일부 IoT Core 장치)가 실행되지 않습니다. 그러나 PC의 경우 x86 패키지가 가장 안전하며 장치 배포 범위가 가장 큽니다. Windows 10 장치의 상당 부분은 x86 버전의 Windows를 계속 실행합니다.


답변

다음 은 다양한 빌드 대상을 설명 하는 빠른 개요 입니다.

내 경험에 비추어 볼 때 x86 및 x64 플랫폼 모두에서 실행되는 프로젝트를 구축하려고하고 특정 x64 최적화가없는 경우에는 구체적으로 “x86″이라고 빌드로 변경합니다.

그 이유는 때때로 충돌하는 DLL 파일이나 x64 환경에서 WoW 가 충돌하는 코드를 얻을 수 있기 때문입니다 . x64 OS는 x86을 구체적으로 지정하여 응용 프로그램을 순수한 x86 응용 프로그램으로 취급하고 모든 것이 원활하게 실행되도록합니다.


답변

Visual Studio .NET 플랫폼 대상 설명 기사를 확인하십시오 .

기본 설정 인 “Any CPU”는 어셈블리가 현재 실행중인 CPU에서 기본적으로 실행됨을 의미합니다. 즉, 64 비트 시스템에서 64 비트로 실행되고 32 비트 시스템에서 32 비트로 실행됩니다. 어셈블리가 64 비트 응용 프로그램에서 호출되면 64 비트 어셈블리 등으로 수행됩니다.

위의 링크가 끊어진 것으로보고되었으므로 다음과 유사한 설명이있는 다른 기사가 있습니다. AnyCPU가 .NET 4.5 및 Visual Studio 11에서 실제로 의미하는 것


답변

“CLR via C #” 책의 출처는 다음을 참조하십시오.

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


답변

“모든 CPU”는 프로그램이 시작될 때 .NET Framework가 OS 비트를 기준으로 32 비트 또는 64 비트로 프로그램을 실행할지 여부를 알아냅니다.

x86모든 CPU 에는 차이가 있습니다 . x64 시스템에서 X86 용으로 컴파일 된 실행 파일은 32 비트 실행 파일로 실행됩니다.

의심이가는 한 Visual Studio 2008 명령 줄로 이동하여 다음을 실행하십시오.

dumpbin YourProgram.exe /headers

그것은 당신에게 프로그램의 비트와 더 많은 것을 알려줄 것입니다.


답변

모든 CPU는 모든 플랫폼에서 작동 함을 의미합니다. 관리 코드가 Java와 유사하기 때문입니다. 런타임에 .NET Framework에서 해석되는 바이트 코드로 컴파일되는 것으로 생각하십시오.

C ++에는 플랫폼 별 머신 코드로 컴파일되므로이 옵션이 없습니다.