C # struct to C ++ Проблема маршаллинга - PullRequest
0 голосов
/ 12 июля 2010

Я вызываю функцию C ++ из C #.

Это заголовок функции в C ++:

int src_simple (SRC_DATA *data, int converter_type, int channels) ;

И это эквивалентная функция C #:

[DllImport("libsamplerate-0.dll")]
    public static extern int src_simple(ref SRC_DATA sd, int converter_type, int channels);

Это структура SRC_DATA в C ++, а затем в C #:

 typedef struct
  {   float  *data_in, *data_out ;

      long   input_frames, output_frames ;
      long   input_frames_used, output_frames_gen ;

      int    end_of_input ;

      double src_ratio ;
  } SRC_DATA ;

Это определенная мной структура C #:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SRC_DATA
{

    public IntPtr data_in, data_out;

    public long input_frames, output_frames;
    public long input_frames_used, output_frames_gen;

    public int end_of_input;
    public double src_ratio;

}

Большая проблема заключается в том, что последнийпараметр src_ratio не доставляется должным образом в функцию C ++ (он видит его как 0 или что-то недопустимое).

Верны ли мои заявления?

Спасибо

Ответы [ 3 ]

4 голосов
/ 12 июля 2010

Вы уверены, что проблема в члене src_ratio?долго в C # это 64 бит.В C ++ на платформе Win32 long является 32-битным, я думаю, вам нужно использовать int в C # для длинных членов структуры C ++.Кроме того, Pack = 1 выглядит немного странно, вы используете такое же выравнивание элементов структуры в C ++?

1 голос
/ 12 июля 2010

Вы форсируете упаковку в C #, но не в C ++.Может случиться так, что компилятор C ++ дополняет 7 in32 четырьмя дополнительными байтами, чтобы обеспечить выравнивание двойного числа в 8 байт.

Проверьте директивы компилятора #pragma pack.

0 голосов
/ 12 июля 2010

Проверьте, какой размер int в вашем C ++ компиляторе. C # int всегда 32 бит.

...