현재 C#에 독점적 인 dll (API)을 포팅하고 있으며 일부 사용 된 데이터 형식을 마샬링 할 때 몇 가지 문제가 있습니다.C#에서 int 및 long 마샬링 C#에서 int 및 long 마샬링
는 예를 들어, API 헤더 파일은 다음과 같은 유형의 정의 :
typedef unsigned int tINT; /* natural unsigned */
typedef signed int tINTs; /* natural signed */
typedef unsigned int tLONG; /* 32 bit unsigned */
typedef unsigned long tPTR; /* 32/64-bit pointer */
을 그럼 예를 들어 다음 함수 정의가 :
tINTs SomeApiFunction (const tPTR hdl, tINT param);
나는 보통 직접으로 int
을 정렬 화하고 있습니다를 C#의 int
(Int32
) 또는 서명되지 않은 버전입니다. API의 tLONG
과 tINT
은 동일합니다 (적어도 API의 경우). 하지만 tPTR
으로는 확신 할 수 없습니다. 32 비트 int이기 때문에 지금은 uint
을 C#으로 만들었지 만, long
이 64 비트 시스템에서 어떻게 동작하는지 잘 모르겠습니다.
API가 32 비트 및 64 비트 시스템에서 올바르게 작동하려면 어떻게해야합니까?
이 지금했을 것입니다 :
[DllImport("api.dll")]
public static extern int SomeApiFunction (uint hdl, uint param);
슬프게도 API는 정말 잘 같은 내가 의도는 모든 사람 (중복) 형식 정의와 무엇인지 확실하지 않다, 문서화되어 있지 않습니다. 위에 포함 된 헤더 주석 외에도 실제 유형에 대한 정보는 없습니다.
오, 그냥 빠른 질문 : 포인터가 * unsigned * long이라는 점을 감안할 때'IntPtr' 또는'UIntPtr'을 사용해야합니까? – poke
포인터 연산으로 인해 음수 값을 처리하는 데 문제가 없으면 IntPtr을 사용해야합니다. msdn docs에서 : IntPtr 형식은 CLS 규격이며 UIntPtr 형식은 그렇지 않습니다. IntPtr 형식 만 공용 언어 런타임에서 사용됩니다. UIntPtr 형식은 주로 IntPtr 형식의 아키텍처 대칭성을 유지하기 위해 제공됩니다. –