У меня есть С++ DLL с экспортированной функцией:
extern "C" __declspec(dllexport) double* fft(double* dataReal, double* dataImag)
{
[...]
}
Функция вычисляет БПФ двух двойных массивов (вещественных и мнимых), возвращает один двойной массив с вещественными мнимыми компонентами, чередующимися: {Re, Im, Re, Im,...}
Я не уверен, как вызвать эту функцию в С#. Что я делаю:
[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:
Невозможно вывести "возвращаемое значение": неверная комбинация управляемых/неуправляемых типов.
Я предполагаю, что это потому, что С++ double*
не совсем то же самое, что С# 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.