我在C#中遇到一个非常奇怪的p / invoke问题。我试图调用的非托管函数有很多参数(23),其中一些是浮点数组。不幸的是我不能发布真正的代码,但最初我将float数组传递给进行p / invoke调用的函数,如下所示:
public void func()
{
float[] a = new float[257];
float[] b = new float[257];
float[] c = new float[257];
float[] d = new float[257];
callDll(a, b, c, d);
}
[DllImport(DllName, EntryPoint="dllfunc", CharSet = CharSet.Ansi)]
public static extern void dllfunc(ref float a, ref float b, ref float c, ref float d);
public void callDll(float[] a, float[] b, float[] c, float[] d)
{
dllfunc(ref a[1], ref b[1], ref c[1], ref d[1]);
}
我知道数组传递的方式有点奇怪,但这一切都很好。然后我决定将浮点数组合成一个对象,所以我把它改成了这样的东西:
public class myObj
{
float[] a;
float[] b;
float[] c;
float[] d;
}
public void func()
{
myObj m = new myObj();
callDll(m);
}
[DllImport(DllName, EntryPoint="dllfunc", CharSet = CharSet.Ansi)]
public static extern void dllfunc(ref float a, ref float b, ref float c, ref float d);
public void callDll(myObj m)
{
float[] a = new float[257];
float[] b = new float[257];
float[] c = new float[257];
float[] d = new float[257];
dllfunc(ref a[1], ref b[1], ref c[1], ref d[1]);
m.a = a;
m.b = b;
m.c = c;
m.d = d;
}
这会运行一次,然后在每次后续调用时崩溃并出现关于Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
的错误奇怪的行为看起来像某种内存损坏问题,但我完全不明白如何更改参数列表包装p / invoke调用的函数可能会产生这种效果。有没有人有任何想法?
更新:我重新安排了一些论点,这个问题似乎已经消失了。它一定是非托管代码正在做的事情,我不确定是什么。我投票决定关闭这个问题,因为它似乎是一个局部问题。
答案 0 :(得分:1)
一个人?应
dllfunc(ref a[1], ref b[1], ref c[1], ref d[1]);
是
dllfunc(ref a[0], ref b[0], ref c[0], ref d[0]);