2011-03-04 2 views
4

x86 및 x64 고정 dll로 컴파일 된 혼합 모드 C++/CLI 프로젝트가 있습니다.임의의 CPU와 x64 간의 관리 코드 참조

"모든 CPU"로 컴파일 된이 프로젝트를 사용해야하는 C# 응용 프로그램이 있습니다. C# 응용 프로그램에서 올바른 dll을 제대로 참조하려면 어떻게해야합니까? 참조를 마우스 오른쪽 단추로 클릭하면 2 개의 DLL 중 1 개만 선택해야합니다.
내 "ANY CPU"C# 응용 프로그램은 때때로 x64 및 x86 프로세스로 실행되기도합니다.

스마트 설정 파일을 통해이 작업을 수행 할 수 있다고 들었습니다.

+0

매니페스트 파일을 편집하여이 작업을 수행 할 수 있다고 생각합니다. 이 작업을 수행하는 UI가 기억납니다. http://msdn.microsoft.com/en-us/library/xhctdw55.aspx하지만 정확히 무엇을해야하는지 기억하지 않습니다. –

답변

1

C++ 프로젝트가 두 번 컴파일 되더라도 x86 및 x64 DLL에 대해 동일한 관리 인터페이스를 가져야합니다. 그러므로 강력한 이름 서명을 사용하지 않는 한 참조하는 DLL 버전이 중요하지 않아야합니다. 중요한 것은 올바른 버전이 대상 컴퓨터에 배포된다는 것입니다.

+0

x64 파일을 참조하고 출력 폴더로 복사하지 않도록 프로젝트 설정을 지정하면 x86 팀의 x86 팀 개발자가 빌드에 문제가 있습니까? 그가 수동으로 정확한 dll을 자신의 출력 폴더에 정확히 한 번 복사해야합니다. 나는 그것이 비 권리 이슈라고 생각한다. – CSharpMan

+0

@CSharpMan, 적절한 도구가 설치된 경우 x86 시스템에서 x64 DLL을 빌드 할 수 있으므로 빌드가 문제가되지 않아야합니다. 러닝은 확실히 문제가 될 것입니다. – JaredPar

+0

@CSharpMan,이 문제에 접근하는 방법은 응용 프로그램의 디버그 설정이 관리되는 응용 프로그램을 x86으로 제한하지만 소매 구성을 AnyCPU로 남겨 둡니다. 이 방법으로 모든 사람이 디버그하에 빌드하고 실행할 수 있습니다. – JaredPar

5

이 문제를 해결할 수있는 방법은 여러 가지가 있습니다. 첫 번째 것은 가장 간단합니다. 실제로 앱이 일 경우은 대상 아키텍처에 종속됩니다. 그리고 AnyCPU는 적절한 설정이 아닙니다. 매우 x64에서 얻을 수있는 거대한 가상 주소 메모리 공간을 필요로하는 경우는 드뭅니다. 특히 x86에서 작동하도록 만들고 싶기 때문에 필요합니다. 그래서 EXE의 Platform target을 x86으로 설정하면 완료됩니다.

둘째로 이것은 배포 문제 일뿐입니다. 64 비트 운영 체제에 응용 프로그램을 설치할 때 혼합 모드 어셈블리의 x64 빌드를 복사하면됩니다. x86 빌드는 32 비트 운영 체제에 설치됩니다. 이를 처리하는 설치 프로젝트를 만들어야합니다. 가장 간단한 방법은 두 가지를 만드는 것입니다. 또한 afaik 유일한 방법.

제 3의 것은 당신이 틀림없이 묻고있는 어느 쪽이든 작동하는 곳에 종과 하나입니다. 이를 위해서는 코드, 프로젝트 및 설치 프로그램을 변경해야합니다. "x86"및 "x64"와 같은 이름의 두 개의 하위 디렉토리를 만드는 빌드 후 이벤트를 작성해야합니다. 그리고 각각의 DLL 버전을 복사하십시오. 이렇게하면 CLR에서 이러한 어셈블리를 찾을 수 없습니다.

코드에서 AppDomain.CurrentDomain.AssemblyResolve 이벤트에 대한 이벤트 처리기를 작성해야합니다. 어셈블리의 모든 유형을 사용하기 전에 Main() 메소드에서이를 구독하십시오. 이벤트 처리기는 Assembly.LoadFrom()을 사용하여 IntPtr.Size 값을 기반으로 하위 어셈블리에서 올바른 어셈블리를로드해야합니다. 64 비트 모드로 실행하면 8입니다.

나는 또 다른 접근법을 언급해야하지만 일반적으로 그렇게 눈살을 찌푸리게됩니다. 두 어셈블리를 모두 GAC에 설치하십시오. 모든 것이 자동입니다.

+0

둘 다 GAC에 설치하는 것이 왜 눈살을 찌푸리게할까요? – CSharpMan

+1

당신은 잘못된 사람에게 물어보고 있습니다, 나는 종교적으로화물 숭배 프로그래밍과 관습을 피합니다.그것에 대해 새로운 질문을 시작하십시오. –