C# struct to C++ Marshalling problem
I'm invoking a C++ function from within C#.
This is the function header in C++ :
int src_simple (SRC_DATA *data, int converter_type, int channels) ;
And this is the equivilent C# functio开发者_如何学编程n :
[DllImport("libsamplerate-0.dll")]
    public static extern int src_simple(ref SRC_DATA sd, int converter_type, int channels);
This is the SRC_DATA structure in C++ and then in 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 ;
This is the C# struct I have defined :
[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;
}
The big problem is that the last parameter , src_ratio, doesn't get delivered properly to the C++ function, (it sees it as 0 or something invalid).
Are my declarations correct?
Thanks
Are you sure that the problem is in src_ratio member? long in C# is 64 bit. In C++ on Win32 platform long is 32 bit, I think you need to use int in C# for long C++ structure members. Also, Pack = 1 looks a bit strange, do you use the same structure member alignment in C++?
You force packing in C# but not in C++. What could be happening is that the C++ compiler is padding the 7 in32's with four additional bytes to ensure the double is 8-byte aligned.
Check the #pragma pack compiler directives.
Check what size an int is in your C++ compiler. A C# int is always 32 bits.
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论