C#struct to C ++编组问题

时间:2010-07-12 08:19:20

标签: c# .net pinvoke marshalling dllimport

我正在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);

这是C ++中的SRC_DATA结构,然后是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 个答案:

答案 0 :(得分:4)

您确定问题出在src_ratio成员中吗? C#中的长是64位。在Win32平台上的C ++中,long是32位,我认为你需要在C#中使用int作为长C ++结构成员。另外,Pack = 1看起来有点奇怪,你在C ++中使用相同的结构成员对齐吗?

答案 1 :(得分:1)

你强制打包C#但不能用C ++打包。可能发生的事情是C ++编译器用7个额外字节填充7 in32,以确保double是8字节对齐。

检查#pragma pack编译器指令。

答案 2 :(得分:0)

检查int在C ++编译器中的大小。 C#int总是32位。