2016-06-23 5 views
1

나는 기본 기능void *가있는 네이티브 함수에서 호출 된 관리되는 대리자의 IntPtr-parameter에서 정수 값을 가져 오는 방법은 무엇입니까?

void SetValue(char *FieldName, void *pValue); 

을하고 난/서명이

void SetValueDelegate(string fieldName, IntPtr value); 

는이 같은 기본 SetValue를 호출 위임 이전 설정 콜백 전화를 변경하려면 :

int IntValue = 0; 
SetValue("MyField", &IntValue); 

이제 나는 그냥 캐스팅 할 수 있다고 생각했습니다. 관리 대리인 :

void SetValueDelegate(string fieldName, IntPtr value) 
{ 
    if (fieldName == "MyField") 
    { 
     int intValue = (int)value; 
    } 
} 

이것은 작동하지 않습니다. 오래도록 캐스트하면 값은 204790096입니다.

어떻게해야합니까?

답변

5

관리 코드에서 valueint 변수의 주소입니다. 따라서 다음과 같은 변수를 읽습니다.

int intValue = Marshal.ReadInt32(value); 

코드는 해당 주소에 저장된 값이 아니라 단순히 주소를 읽는 것입니다.

+0

감사합니다. 그것은 자연적으로 사실입니다. 다른 방법을 찾았습니다. (int) Marshal.PtrToStructure (value, typeof (int)); 그러나 당신의 대답은 더 분명합니다. –

+0

그게 너무 작동하지만,'ReadInt32'는 내가 생각하기에 복싱과 언 박싱을 피한다. –