У меня очень странная проблема с 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 может иметь такой эффект. У кого-нибудь есть идеи?
ОБНОВЛЕНИЕ: Я изменил аргументы еще немного, и эта проблема, кажется, ушла. Должно быть, это было что-то, что делал неуправляемый код, я не уверен, что. Я проголосовал за закрытие этого вопроса, поскольку, похоже, это была локализованная проблема.