2013-06-11 1 views
1

참조 할 곳이 third party assembly 인 프로젝트가 있습니다.어셈블리에 특정 버전 (x86 또는 x64)이있는 경우에만 명령문 컴파일

조립품은 x86 and x64 versions입니다. 제 3 자 시스템이 특정 작업에 의존하기 때문에 하나만 참조 할 수 있습니다. (시스템에 설치된 시스템에 따라 다름)


지금까지이 답변을 사용하여 단일 프로젝트에서 두 버전을 모두 관리 할 수있었습니다. 그래서 구성 관리자 옵션을 x86 또는 x64로 설정하고 참조 할 버전을 알고 있습니다.


Targeting both 32bit and 64bit with Visual Studio in same solution/project

그러나 그 다음 나는 다음과 같은 문제와 함께 : 해당 어셈블리 가진 버전 특정 매개 변수 유형에서 방법을 사용하는 데 필요한.

x64 버전에는 x86에없는 IdToObject(long ID) 메서드가 있습니다.

x86 버전에는 x64에없는 IdToObject(int ID) 메서드가 있습니다.

ID는 동일한 타사의 다른 어셈블리에서 제공됩니다 (버전은 해당되지 않음). ObjectID 클래스는 나에게 ToInt32()ToInt64() 메소드를 제공합니다. 나는 x64 버전의 IdToObject(ID.ToInt32())을 시도 할 경우


는, 나는 overflow at runtime를 얻을.

버전에서 IdToObject(ID.ToInt64())을 시도하면 doesn't compile (길게 전달하려고 함).

나는 이것을 시험해 보았지만 x64 버전에서는 정상적으로 동작하지만 x86에서는 컴파일되지 않는다.

if (System.Reflection.Assembly.GetExecutingAssembly().GetName().ProcessorArchitecture == System.Reflection.ProcessorArchitecture.X86) 
    return Document.IdToObject(ObjectID.ToInt32()); //returns an object 
else 
    return Document.IdToObject(ObjectID.ToInt64()); //returns an object 

그래서 프로젝트가 x86으로 설정된 경우 한 줄을 컴파일하지 않아도되고 프로젝트가 x64로 설정된 경우 다른 줄을 컴파일하지 않아도됩니다. 내가 무엇을 할 수 있을지?

+0

전 처리기 지시문을 사용해야 할 것 같은데요? 다른 방법이있을 수 있지만 그것이 무엇이 될지 모르겠다. http://msdn.microsoft.com/en-us/library/ed8yd1ha(v=vs.100).aspx –

답변

1

전 처리기 지시문을 사용해야 할 것 같습니다. 64 비트 빌드 구성에 대한 프로젝트 속성에서 빌드, 조건부 컴파일 기호 아래에 WIN64를 추가합니다. 그런 다음 코드를 다음으로 변경하십시오.

#if WIN64 
     return Document.IdToObject(ObjectID.ToInt64()); //returns an object 
#else 
     return Document.IdToObject(ObjectID.ToInt32()); //returns an object 
#endif 
+0

기호는 원하는 것일 수 있습니다. 기호를 32 비트 빌드 구성에 추가하려는 경우 자유롭게 되돌릴 수 있습니다. –