C# struct to C++ Marshalling проблем

Извиквам 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 или нещо невалидно).

Правилни ли са моите декларации?

Благодаря


person Roey    schedule 12.07.2010    source източник


Отговори (3)


Сигурни ли сте, че проблемът е в члена src_ratio? long в C# е 64 бита. В C++ на платформа Win32 long е 32 бита, мисля, че трябва да използвате int в C# за дълги C++ структурни членове. Освен това Pack = 1 изглежда малко странно, използвате ли същото подравняване на член на структурата в C++?

person Alex F    schedule 12.07.2010
comment
Бяхте прав, pack = 1 беше грешка.. Просто го оставих да използва по подразбиране :) - person Roey; 12.07.2010

Принуждавате опаковане в C#, но не и в C++. Това, което може да се случи, е, че C++ компилаторът допълва 7 in32 с четири допълнителни байта, за да гарантира, че двойното е подравнено с 8 байта.

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

person Community    schedule 12.07.2010

Проверете какъв размер е int във вашия C++ компилатор. C# int винаги е 32 бита.

person Rich Tebb    schedule 12.07.2010