2012-09-24 1 views
0

pinvoke를 사용하여 데이터를 교환하는 C# 응용 프로그램에서 C DLL을 호출했습니다. 다음에서 나는 int 클래스와 2 개의 char 배열로 구성된 간단한 클래스를가집니다. 모든 것은 멋지게 작동합니다. C#은 "getStreamGroup"을 사용하여 DLL을 올바르게 호출하고 DLL은 전달 된 streamGroup 구조를 올바른 데이터로 채 웁니다.pinvoke : 구조체가 C면에 채워지지만 집에있을 때 데이터가 사라짐

그러나 C 함수가 완료되고 C# 측에 돌아 오면 전달 된 올바른 데이터로 채워진 streamGroup은 현재 불량입니다 (3 개의 null 값). VS2010의 오류/경고가 없습니다. 64 비트 앱입니다. 아이디어가 있으십니까?

#define STREAM_COUNT 9000 

typedef struct s_streamGroup 
{ 
    int systemDefinedGroup; 

    char name[BUFFER_SIZE_128]; 
    char streamList[STREAM_COUNT]; 

} streamGroup; 


public class streamGroup 
{ 
    public int systemDefinedGroup; 

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = constants.BUFFER_SIZE_128)] 
    public byte[] name; 

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = constants.STREAM_COUNT)] 
    public byte[] streamList; 
} 


DLL int getStreamGroup(int groupIndex, streamGroup *RequestedStreamGroup) 
{ 
    *RequestedStreamGroup = Environment.StreamGroup[groupIndex]; 
    return(DLL_NO_ERROR); 
} 

[DllImport(constants.DLL_PATH, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 
public static extern int getStreamGroup([In] int groupIndex, [In, Out] streamGroup group); 

답변

0

streamGroup 앞에 [StructLayout (LayoutKind.Sequential)]이 필요합니다.

충분하지 않은 경우 코드를 좀 더 명확하게 작성하십시오. 어떤 코드가 어떤 프로젝트에 있는지 확신하지 못합니다. (네이티브 C++ 프로젝트와 C# 프로젝트가 맞다면 이해할 수 있습니다.) 어떤 것이 있는지 보여주는 두 개의 목록을 제공하거나, 나의 이해가 부정확 할 경우 당신이하고있는 것을 설명하십시오.

+0

당신은 미쳤지 만, 당신은 당신의 pinvoke을 알고 있습니다! 아름답게 작동합니다 ... 그라시아 스! – PaeneInsula

관련 문제