У меня есть C ++ DLL с экспортированной функцией:
extern "C" __declspec(dllexport) double* fft(double* dataReal, double* dataImag)
{
[...]
}
Функция вычисляет БПФ двух двойных массивов (реального и мнимого) и возвращает один двойной массив с реальным чередованием мнимых компонентов: {Re, Im, Re, Im, ...}
Я не уверен, как вызвать эту функцию в C #.То, что я делаю, это:
[DllImport("fft.dll")]
static extern double[] fft(double[] dataReal, double[] dataImag);
, и когда я проверяю это так:
double[] foo = fft(new double[] { 1, 2, 3, 4 }, new double[] { 0, 0, 0, 0 });
Я получаю исключение MarshalDirectiveException:
Невозможно выполнить маршал'возвращаемое значение': недопустимая комбинация управляемого / неуправляемого типа.
Я предполагаю, что это потому, что C ++ double*
не совсем то же самое, что C # double[]
, но я не уверенкак это исправить.Любые идеи?
Редактировать: я изменил подписи, так что теперь я передаю некоторую дополнительную информацию:
extern "C" __declspec(dllexport) void fft(double* dataReal, double* dataImag, int length, double* output);
Мы всегда знаем, что длина output
будет 2x length
и
[DllImport("fft.dll")]
static extern void fft(double[] dataReal, double[] dataImag, int length, out double[] output);
протестировано так:
double[] foo = new double[8];
fft(new double[] { 1, 2, 3, 4 }, new double[] { 0, 0, 0, 0 }, 4, out foo);
Теперь я получаю AccessViolationException, а не MarshalDirectiveException.