2009-12-05 4 views
0

Visual Studio에서 때때로 COM 라이브러리의 SAME 포인터 매개 변수를 uint으로 변경하고 때로는 ulong으로 변경합니까? 난 내 데스크톱 컴퓨터에서이 라이브러리를 참조 할 때, interop 어셈블리가 uintULONG_PTR을 회전 등Interop 어셈블리 포인터 길이

[ in ] ULONG_PTR ParentWindow 

과 같은 매개 변수를 사용하여 몇 가지 방법이있는 COM 라이브러리를 가지고있다. 내 노트북에서도 똑같이 작업하면 ulong으로 바뀝니다. 이로 인해 시스템간에 프로젝트를 공유 할 때 문제가 발생합니다. 아마도 프로젝트의 나머지와 함께 SVN에 Interop 어셈블리를 저장할 수 있지만, 예를 들어 COM 라이브러리를 업데이트 한 후에 다시 생성해야하는 경우 문제가 발생합니다.

이 시스템은 다음과 같습니다

 
Desktop        Laptop 
- Windows Vista Professional 64-bit - Windows 7 Ultimate 64-bit 
- Visual Studio 2008 Professional  - Visual Studio 2008 Team System 
    (SP1)         Development Edition (SP1) 
- .Net Framework 3.5 SP1    - .Net Framework 3.5 SP1 

UAC가 활성화되어 및 Visual Studio를 관리자 권한으로 실행됩니다.

랩톱에서 Visual Studio 2008 SP1을 적용 해 봅니다.

편집 : 랩톱에 적용된 SP1이 적용되지 않습니다.

업데이트 :

Visual Studio에서 COM 라이브러리에 대한 참조를 추가, 프로세스 모니터가 노트북에 COMLibrary64.dll을 읽는 동안 데스크톱 컴퓨터에 COMLibrary.dll를 읽고 devenv를 보여줍니다. 랩탑이 ulong을 표시하는 동안 데스크탑이 포인터에 대해 uint를 표시하는 이유가 바로 이것입니다.

왜 이렇게합니까? 두 컴퓨터의 Devenv 프로세스가 WoW64에서 실행 중입니다.

프로그램을 실행할 때 프로세스 모니터에 따라 두 컴퓨터에서 COMLibrary64.dll을 사용합니다. 그래서 문제는 참조를 추가하는 동안에 만 나타나는 것 같습니다.

다음에 수동으로 interop 생성을 시도합니다.

답변

1

분명히 동일한 COM 서버입니까, 32 대 64 비트 버전입니까? ULONG_PTR은 32 비트 컴파일 타겟에서는 32 비트이고 64 비트 컴파일 타겟에서는 64 비트이지만 네이티브 코드는 컴파일 타임에 둘 중 하나 여야합니다. .

개념적으로 "올바른"변환은 UIntPtr이지만, 필요한 것보다 .NET Framework 프로세스가 실행중인 프레임 워크에 따라 부동 상태가됩니다. COM 서버의 비트 수입니다.

+0

예 차이점은 32 대 64 비트 버전에서 발생합니다. 내가 이것을 확인하는 방법을 알았을 때 원래 게시물을 약간 업데이트했습니다. 왜 아직도 차이인지 모르겠다. –

+0

오, 나는 (U) IntPtr이 어떤 경우라도 정확하다고 생각합니다. 이러한 매개 변수는 대부분 윈도우 핸들이며 적어도 WinForms 컨트롤은 Handle 속성을 IntPtr로 노출합니다. 이제는 그걸 tlbimp에 알려주는 방법을 알아 내야합니다. –

+0

COM은 이진 표준입니다. COM 인터페이스는 32 비트와 64 비트 사이에서 어떤 .NET 프레임 워크가 실행되었는지에 따라 부동 상태가 될 수 없지만 .NET 코드는 실행됩니다. 실행 파일이 하나 또는 둘 다 (예 : AnyCPU가 아닌)로 고정되어있는 경우에만 U/IntPtr을 사용해야합니다. –