2017-11-13 9 views
0

C#에서 C++ dll 함수를 호출하려고합니다. 이 함수는 struct를 매개 변수로 가지며 변수 aby_data [8]에 문제가 있습니다. 서명되지 않은 char []을 byte []로 정의하면 프로그램이 중단되지 않지만 데이터를받지 못합니다.C#에서 C++의 부호없는 char 배열

구조체 C++ C#

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct CMSG 
{ 
    public Int32 l_id; 
    public byte by_len; 
    public byte by_msg_lost; 
    public byte by_extended; 
    public byte by_remote; 
    public byte aby_data[]; 
    public UInt32 ul_tstamp; 
}; 

CMSG t_CANMsg[] = new CMSG[1]; 
t_CANMsg[0].aby_data = new byte[8]; 
t_CANMsg[0].aby_data[0] = 01; 
t_CANMsg[0].aby_data[1] = 02; 
t_CANMsg[0].aby_data[2] = 03; 
t_CANMsg[0].aby_data[3] = 04; 
t_CANMsg[0].aby_data[4] = 05; 
t_CANMsg[0].aby_data[5] = 06; 
t_CANMsg[0].aby_data[6] = 07; 
t_CANMsg[0].aby_data[7] = 08; 

l_retval = canSend(handle, out t_CANMsg[0], out len); 
+0

. 'out'이 이상하다는 것에 유의해라. 호출 전에 구조체를 초기화 할 때 반드시'ref' 될 필요가있다. 어쩌면 [In, Out]도 마찬가지입니다. –

답변

1

당신은 고정 길이 배열을 정렬 화하고,하지만 당신은 당신의 구조체 정의에 배열의 크기를 지정하지 않았에

typedef struct st_canmsg 
{ 
    long l_id; 
    unsigned char by_len; 
    unsigned char by_msg_lost; 
    unsigned char by_extended; 
    unsigned char by_remote; 
    unsigned char aby_data[8]; 
    unsigned long ul_tstamp; 
} CMSG; 

변환.

는이처럼 구조체 정의를 업데이트 할 수 있습니다 :

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct CMSG 
{ 
    public Int32 l_id; 
    public byte by_len; 
    public byte by_msg_lost; 
    public byte by_extended; 
    public byte by_remote; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    public byte aby_data[]; 
    public UInt32 ul_tstamp; 
}; 

또는, 당신은 명시 적으로 바이트를 정의하기 위해 시도 할 수 있습니다 :

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct CMSG 
{ 
    public Int32 l_id; 
    public byte by_len; 
    public byte by_msg_lost; 
    public byte by_extended; 
    public byte by_remote; 
    public byte aby_data_0; 
    public byte aby_data_1; 
    public byte aby_data_2; 
    public byte aby_data_3; 
    public byte aby_data_4; 
    public byte aby_data_5; 
    public byte aby_data_6; 
    public byte aby_data_7; 
    public UInt32 ul_tstamp; 
}; 

문제가 계속 발생하는 경우 또한 canSend의 선언을 공유 하시겠습니까? 내가 배열로 사용 그것을 위해이 솔루션을받은 프레데릭 CARLIER 코드를 기반으로

+0

감사합니다. Frederik Carlier 두 번째 옵션이 정상적으로 작동합니다! – marc29

0

:

당신은 aby_data 회원에게 [MarshalAs (UnmanagedType.ByValArray, SizeConst = 8)]를 적용 할 필요가
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct CMSG 
{ 
    public Int32 l_id; 
    public byte by_len; 
    public byte by_msg_lost; 
    public byte by_extended; 
    public byte by_remote; 
    public byte aby_data_0; 
    public byte aby_data_1; 
    public byte aby_data_2; 
    public byte aby_data_3; 
    public byte aby_data_4; 
    public byte aby_data_5; 
    public byte aby_data_6; 
    public byte aby_data_7; 
    public UInt32 ul_tstamp; 

    public byte[] aby_data(){ 
     byte[] aby_data_array = new byte[8]; 
     aby_data_array[0] = aby_data_0; 
     aby_data_array[1] = aby_data_1; 
     aby_data_array[2] = aby_data_2; 
     aby_data_array[3] = aby_data_3; 
     aby_data_array[4] = aby_data_4; 
     aby_data_array[5] = aby_data_5; 
     aby_data_array[6] = aby_data_6; 
     aby_data_array[7] = aby_data_7; 
     return aby_data_array; 
    } 
}; 


l_retval = canRead(handle, out t_CANMsg[0], out len); 
byte data [] = t_CANMsg[0].aby_data();