2010-07-12 2 views
0

Я вызываю функцию C++ изнутри C#.C# struct to C++ Проблема маршаллинга

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

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

И это equivilent 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 или что-то недействительное).

Являются ли мои заявления верными?

Благодаря

ответ

4

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

+0

Вы были правы, pack = 1 была ошибкой .. Я просто позволил ей использовать значение по умолчанию :) – Roey

1

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

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

0

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