2010-07-12 9 views
0

C#에서 C++ 함수를 호출하고 있습니다. C# struct to C++ 마샬링 문제

은 ++ C 펑션 헤더이다

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

그리고 이것은 equivilent의 C# 1 함수 :

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 ; 
:

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

이것은 ++ C에서 SRC_DATA 구조시킨 후 C에서 #

이것은 내가 정의한 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 회원에 문제가 있습니까? C#은 64 비트입니다. C++에서 Win32 플랫폼에서 long은 32 비트입니다. long C++ 구조체 멤버의 경우 C#에서 int를 사용해야한다고 생각합니다. 또한 Pack = 1은 약간 이상하게 보입니다. C++에서 동일한 구조체 정렬을 사용합니까?

+0

당신이 옳았습니다, 꾸러미 = 1은 실수였습니다. 나는 단지 그것이 기본값을 사용하도록했습니다 :) – Roey

1

당신은 C#이 아닌 C++로는 강제로 패킹해야합니다. 무슨 일이 일어날 수 있습니다 C + + 컴파일러는 4 바이트로 8 바이트 정렬 보장하기 위해 4 바이트로 7 in32의 패딩입니다.

#pragma pack 컴파일러 지침을 확인하십시오.

0

C++ 컴파일러에서 int 크기를 확인하십시오. C# int는 항상 32 비트입니다.