2011-05-12 6 views
4

이중 간접 포인터의 여러 인수를 사용하는 C 함수가 있습니다. C#에서 지금이DLL 가져 오기 malloc 이중 간접 포인터

int myFunction (int ** foo, int** bar, int **baz){ 
    int size = figureOutSizeFunction(); 
    *foo = (int*) malloc (sizeof(int) * size); 
    return SomeOtherValue; 
} 

같은

뭔가 나는 그러나 IntPtr입니다은 항상 0,을 IntPtr로에게 심판을 통과하려합니다. 그리고 그 값을 다음 DLL C 함수에 전달하면 DLL이 시스템 액세스 위반으로 실패합니다. 그 코드가 C 전용 환경에서 작동한다는 것을 알고 있습니다. 그러나 C#에서 호출 할 때 작동하지 않습니다.

C로 전달할 때 필요한 C# 변수 유형은 무엇입니까? DLL? 심판 심판 int?

+1

더 읽을으로 다시 작성할 수 있습니다. 그런 다음 DLL을 다시 호출하여 무료로 호출해야합니다. 마지막으로, 왜 malloc()의 반환 값을 캐스팅하고 있습니까? 그 나쁜. –

답변

4

이중 포인터 (**)를 다룰 때는 가장 좋은 방법은 IntPtr으로 마샬링하는 것입니다.

public static extern int myFunction(IntPtr foo, IntPtr bar, IntPtr baz); 

이중 포인터로 파고는 관리 코드에서 수행됩니다.

IntPtr foo, bar baz; 
... 
myFunction(foo, bar, baz); 

IntPtr oneDeep = (IntPtr)Marshal.PtrToStructure(foo, typeof(IntPtr)); 
int value = (int)Marshal.PtrToStructure(oneDeep, typeof(int)); 

위의 코드는 분명히 약간 ... ugly입니다. 나는 좋은 확장 방법으로 이것을 IntPtr에 포장하는 것을 선호한다.

public static class Extensions { 
    public static T Deref<T>(this IntPtr ptr) { 
    return (T)Marshal.PtrToStructure(ptr, typeof(T)); 
    } 
} 

그런 다음 위의 당신은`심판 IntPtr`을 통과 한 후 배열을 읽을`Marshal.PtrToStructure`를 사용하려면

int value = ptr.Deref<IntPtr>().Deref<int>(); 
관련 문제