我有一个C函数,它接受双重间接指针的几个参数。
类似这样的事情
int myFunction (int ** foo, int** bar, int **baz){
int size = figureOutSizeFunction();
*foo = (int*) malloc (sizeof(int) * size);
return SomeOtherValue;
}
现在在C#中我试图将它传递给IntPtr,但是IntPtr总是为零。当我将这些值传递给下一个DLL C函数时,DLL因系统访问冲突而失败。我知道代码在仅C环境中工作(我有一个“主”来测试代码)但是,从C#调用它时它不起作用
C#中需要什么变量类型才能传递给C DLL? ref ref int?
答案 0 :(得分: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));
上面的代码显然有点......丑陋。我更喜欢在IntPtr
上将它包装在漂亮的扩展方法中。
public static class Extensions {
public static T Deref<T>(this IntPtr ptr) {
return (T)Marshal.PtrToStructure(ptr, typeof(T));
}
}
然后可以将上面的内容重写为更易读的
int value = ptr.Deref<IntPtr>().Deref<int>();