DLL导入malloc双间接指针

时间:2011-05-12 15:10:19

标签: c# c dll dllimport

我有一个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?

1 个答案:

答案 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>();
相关问题