使用p / invoke进行奇怪的数据损坏行为

时间:2011-05-20 23:13:02

标签: c# interop pinvoke

我在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调用的函数可能会产生这种效果。有没有人有任何想法?

更新:我重新安排了一些论点,这个问题似乎已经消失了。它一定是非托管代码正在做的事情,我不确定是什么。我投票决定关闭这个问题,因为它似乎是一个局部问题。

1 个答案:

答案 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]);