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


496

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

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

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


4
사용하는 플랫폼 대상을 결정할 때 한가지 더 고려해야 할의 목표 경우 시작 프로젝트 입니다 Any CPU및 64 비트 OS에서 실행 해있어, 당신은 할 수있는 기능 상실 편집을 계속 디버깅하는 동안. (64 비트 프로세스를 효과적으로 디버깅하고 있습니다). 당신은 만들 수있는 시작 프로젝트의 대상 x86이 동안 디버깅을 회피 할 수있다. (스타트 업 프로젝트에서 참조 된 어셈블리는 계속 대상이 될 수 있습니다 Any CPU.
Cristian Diaconescu

8
@CristiDiaconescu VS2013으로 편집 및 계속 가능
ms007

프로젝트에 대한 대상 비트 크기를 설정하는 것이 플랫폼에 따라 응용 프로그램 소비에 영향을 줄 수 있으므로 프로젝트가 응용 프로그램인지 또는 클래스 라이브러리인지에 대한 메모가 여기에 있다고 생각합니다. 나는 함께이 우연히 x86라이브러리가에 의해 소비되는 AnyCPU내가 설정 한 응용 프로그램 Prefer 32-bit로드 오류를 방지 할 수 있습니다.
SteveCinq

답변:


386

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

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


3
그렇다면 C ++에서 x64로 JIT 할 어셈블리를 어떻게 생성합니까?
galets

50
C ++ 프로젝트는 네이티브 코드로 컴파일되므로 JIT 컴파일러는 포함되지 않습니다. 따라서 요청한 작업을 수행 할 수 없습니다.
cplotts

7
@cplotts : @galets가 3 개월 전에이 질문을했기 때문에 귀하의 답변을 볼 것입니다. 댓글에 @galets 접두사를 사용하여 내가 여기에있는 방식과 비슷한 방식으로 답변에 대한 알림을받습니다.
AnthonyWJones

4
@AnthonyWJones 일반적으로 사용자는 모든 의견에 대한 알림을 받으므로이 경우와 같이 사용자가 질문의 OP 인 경우를 제외하고는 정확합니다.
Mark Hurd

12
@MarkHurd 실제로이 경우 OP는 알 수 없습니다. @ 구문으로 특별히 핑되지 않는 한 OP는 답변에 대한 주석 받지 않습니다. OP는 원래 질문에 추가 된 의견 만 자동으로 통보받습니다.
RSW

322

나는 대부분의 중요한 것들이 언급되었다고 생각하지만 한 가지만 추가 할 것이라고 생각했습니다. 모든 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를 계속 실행합니다.


2
주어진 DLL이 32 비트 전용인지 여부를 결정하는 방법을 말하기 위해 답변을 편집 할 수 있습니다. 내가 아는 한, 이것을 알아 내야합니다. 우리는 x86만이 아니라 "Any CPU"인 DLL을 원한다고 생각합니다.
Dan W

중요한 차이 +1 32 비트 종속성을 사용해야했습니다 (그렇지 않은 것으로 식별 됨). 암호 런타임 오류 메시지를 파악할 수 없습니다. 순식간에 CPU 대상을 변경하고 작동했지만 "why"를 검색했습니다. 모든 것이 64 비트이고 비 호환성 문제가 16 비트 대 32 비트처럼 기이하게 보일 때 언젠가는 좋을 것입니다.
Gerald Davis

2
@ GeraldDavis-동의합니다. 아이러니 한 이유는 32 비트 및 64 비트 종속성 (CLR에 썽킹 레이어가 없음)을 혼합 할 수없는 기술적 이유가 없으며 비트를 보았을 때 .NET 초기에 실망했습니다. ness는 배포 할 때 고려해야 할 사항입니다 (VM / JIT라는 점을 고려하면 조금 더 가치를 제공 할 수있는 기회였습니다).
codenheim

1
@mrjoltcola : 그보다 더 나쁜 것은 Microsoft가 레지스트리 항목이 화면 색상, 기본 설정 등과 같은 것을 제어하더라도 32 비트 및 64 비트 유니버스로 분할되어야한다고 생각할 수없는 이유입니다.
supercat

이것은 내가 찾은 대답입니다 ... 감사합니다!
Daminion Software의 Murat

52

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

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

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


37
서버 환경을 작성하고 응용 프로그램이 2GB 이상의 메모리를 사용할 수 있기를 원한다면 끔찍할 수 있습니다. 또한 언젠가 파이프에서 다운 될 수있는 x64 JIT 최적화를 선택 해제합니다.
오스틴 해리스

AnyCPU 컴파일과 관련된 런타임 문제의 양은 누군가가 두 가지 모두에서 작동하는 바이너리를 명시 적으로 요청하지 않은 한 빌드 옵션으로 사용을 중지하는 데 필요한 모든 정당성입니다. 나는 10 년 이상 동안 x64 이상의 x86 바이너리를 요청하지 않았습니다.
kayleeFrye_onDeck

2
"x86을 구체적으로 지정함으로써 x64 OS는이 앱을 순수한 x86 앱으로 취급하고 모든 것이 원활하게 실행되도록합니다." 죄송합니다. 동의하지 않습니다. 64 OS는 여전히 WOW64 내부에 86의 응용 프로그램을 실행합니다
디프 Janjua에게

이것은 그 영향을 완전히 이해하지 못하는 사람에게 나쁜 조언입니다. @AustinHarris는 훌륭한 예입니다. 웹 작업자 프로세스가 단지 몇 GB의 RAM으로 제한되었다고 상상해보십시오 (최근에 프로덕션 환경 에서이 문제를 해결해야 했음).
rgoliveira

47

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

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

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


1
연결이 끊어짐-이제 도메인 파킹으로 이동합니다.
Jon Adams

비슷한 정보를 가진 두 번째 기사에 대한 링크를 추가했습니다. 도메인이 다시 활성화 될 수 있도록 첫 번째 링크를 떠났습니다.
DCNYAM


39

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

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

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

dumpbin YourProgram.exe /headers

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


7
"any cpu"에 내장되어 있으면 덤프 빈 헤더에 32 비트로 표시됩니다.
Kirbinator

34

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

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


12
다른 사람이하지 않은 질문의 한 부분에 답하기 위해 +1 (AnyCPU가 옵션이없는 C ++ 프로젝트에 대해).
cplotts

C ++ / CLI는 머신 코드 (/ clr : pure)없이 IL 코드로 컴파일 할 수 있습니다. 그러나 sizeof (void *)는 여전히 C ++에서 컴파일 타임 상수 여야합니다. 따라서 머신 코드가없는 경우에도 32 비트 및 64 비트에서 동시에 작동하는 이진 파일을 만들 수 없습니다.
다니엘

5

이 게시물을 읽는 것이 좋습니다 .

AnyCPU 사용시 의미는 다음과 같습니다.

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

8
"32 비트 선호"가 선택된 경우에만.
Florian Winter

이후 비주얼 스튜디오 11의 기본 무엇입니까
Moerwald

@ Moerwald 나는 그것이 수정 된 버그라고 생각합니다. mamczas가 참조 하는 게시물을 읽으면 작성자는 "현재 Visual Studio UI에서"32 비트 선호 "가 회색으로 표시되고 선택되지 않은 상태입니다. 실제로는 활성화되어 있습니다."; 내 VS 버전 (15.8.0)에서 옵션은 여전히 ​​회색으로 표시되고 선택되지 않지만 예상대로 작동합니다 (컴파일 된 어셈블리의 CorFlags 섹션에서 플래그 32BITPREF = FALSE)
Raikol Amaro

-1

이것이 Visual Studio 2017에서 수행 한 방법입니다.

  • 솔루션 탐색기에서
  • 프로젝트를 마우스 오른쪽 버튼으로 클릭
  • "속성"을 클릭하십시오
  • "빌드"를 클릭하십시오
  • "32 비트 선호"옵션 끄기
  • 그리고 플랫폼 대상에서 "x64"를 선택할 수 있습니다.

이 답변은 주제에 맞지 않습니다.
조나스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.