2014-11-20 2 views
1

x86 용으로 빌드 된 라이브러리가 있습니다. 어셈블리를 참조하고 "모든 CPU"에 .NET 프로젝트를 컴파일하면, 다음과 같은 컴파일러 경고를 얻을 :프로세서 아키텍처 문제 (x86 대 모든 CPU)

"There was a mismatch between the processor architecture of the project being built "MSIL" and 
the processor architecture of the reference "xxx", processorArchitecture=MSIL", "x86". This 
mismatch may cause runtime failures. Please consider changing the targeted processor 
achitecture of your project through the Configuration Manager..." 

나는 두 개의 프로젝트가 있습니다. 프로젝트 A와 B. 둘 다 .net # visual studio (2013) 프로젝트입니다. 프로젝트 A는 Windows 서비스이고 프로젝트 B는 간단한 Windows 양식 응용 프로그램입니다. 둘 다 x86 라이브러리를 다시 (때때로) 사용하는 공통 라이브러리 (또한 모든 CPU)를 사용합니다.

프로젝트 A (Windows 서비스, anycpu를) -> CommonLibrary (anycpu를) -> UtilityLibrary (86)

프로젝트 B (윈폼, anycpu를) -> CommonLibrary (anycpu를) -> UtilityLibrary (86)

프로젝트 A에서는 UtilityLibrary를 사용할 때 런타임 오류가 발생합니다. 그러나 프로젝트 B가 아닙니다. UtilityLibrary가 "Any Cpu"로 빌드되거나 Project A가 x86에서 빌드되면 프로젝트 A의 런타임 오류가 해결됩니다. 따라서이 문제와 관련이 있습니다.

내 질문에 : 어떤 경우에 아키텍처 관련 라이브러리를 사용하여 런타임 오류가 발생합니까?

UtilityLibrary는 최신 소프트웨어 릴리스의 일부이며 CommonLibrary는 소프트웨어 릴리스의 일부인 API이기도합니다. 나는 이것의 결과를 결정하려고 노력하고있다. 향후 릴리스에서는 X86이 될 이유가 없으므로 AnyCpu 용 UtilityLibrary가 빌드됩니다.

답변

3

64 비트 컴퓨터에서 실행되는 경우 표준 동작은 32 비트 프로세스가 아닌 64 비트 프로세스에서 AnyCPU 실행 파일을 실행하는 것입니다. x86이라고 표시된 어셈블리는 64 비트 프로세스에서로드되지 않습니다. .NET Framework는 아키텍처 관련 특정 항목이 있다고 가정하며 아키텍처 관련 작업을 수행 할 때 충돌이나 잘못된 작업을 수행하는 대신 문제를 미리보고하는 것이 좋습니다.

빌드 도구는 해당 시나리오에서 실행하면 빌드 도구를 경고합니다.

UtilityLibrary에 프로세서 관련 코드가 포함되어 있지 않거나 32 비트 라이브러리 (예 : JET 데이터베이스 엔진)로만 사용할 수있는 유틸리티가있는 경우에는 다음을 변경하여 재 컴파일을 피할 수 있습니다. 헤더는 CorFlags.exe을 사용합니다. 당신이 필요로하는 명령은 다음과 같습니다 .NET 4.5에서

corflags <path-to-assembly> /32bit- 

는 새로운 옵션이 가능하게되었다 : '32 비트 선호'. C# 컴파일러의 경우이 옵션은 /platform:anycpu32bitpreferred입니다. 이 값으로 표시된 실행 파일은 32 비트 런타임을 사용할 수있는 경우 64 비트 시스템에서 32 비트 프로세스로 실행됩니다. Windows 7/Server 2008 R2 이상에서는 실제로 32 비트 프로그램을 실행할 수있는 WOW64 레이어를 제거 할 수 있습니다. 실행 파일을 'x86'으로 표시했다면 WOW64가 없으면 전혀 실행되지 않지만 Any CPU + Prefer 32 비트를 사용하면 64 비트 프로세스로 실행됩니다.

새 Windows Forms 및 Windows 서비스 프로젝트의 경우 Visual Studio 2013의 기본값은 '모든 CPU'및 '32 비트 선호'입니다. (업데이트 3에서 테스트되었습니다.) Visual Studio의 이전 버전에서 업그레이드 된 프로젝트의 설정이 다를 수 있습니다. ProjectB가 ProjectB가 이전 버전에서 작성되었거나 누군가가 해당 설정을 변경 한 경우 ProjectB가 작동하지 않는 이유는 ProjectB가 작동하는 이유를 설명합니다.

+0

감사합니다. 그것은 나를 위해 일을 정리했다. utilitylibrary로 작업 한 winforms 응용 프로그램은 실제로 x86으로 설정되었습니다. 임의의 CPU로 설정하면 실패합니다. –

1

세부적인 설정을 확인하십시오. 아키텍처 선택 외에도 "prefere 32 bit"체크 박스가 있습니다. 이 확인란은 Windows 클라이언트 응용 프로그램의 경우 기본적으로 선택되어 있으므로 WinForms 응용 프로그램이 32 비트로 실행되고 작동합니다. 대부분의 Windows 서비스에는 검사가 없으므로 64 비트로 실행됩니다.

관련 문제