Странное поведение с повреждением данных с помощью p / invoke - PullRequest
0 голосов
/ 21 мая 2011

У меня очень странная проблема с p / invoke в C #. Неуправляемая функция, которую я пытаюсь вызвать, имеет довольно много аргументов (23), некоторые из которых являются массивами с плавающей точкой. К сожалению, я не могу опубликовать реальный код, но изначально я передавал массивы с плавающей точкой в ​​функцию, которая выполняет вызов 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 Ответ

1 голос
/ 21 мая 2011

по одному? должен

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]);
...