2012-10-05 1 views
0

C DLL에서 C# 응용 프로그램으로 데이터를 가져와야합니다.C (관리되지 않음)에서 C# (관리 대상)에 데이터 유형 매핑

'KnittingWago.Common.WAGO_DATA_TO_USER_T'유형의 'Counters'필드를 마샬링 할 수 없습니다 : 잘못된 관리/비 관리 유형 조합 (배열 필드는 ByValArray 또는 SafeArray와 쌍을 이루어야 함).

const int WAGO_NB_COUNTERS_C = 80; 
const int WAGO_NB_ENCODERS_C = 10; 

struct WAGO_DATA_TO_USER_T 
{ 
    [MarshalAs(UnmanagedType.U4, SizeConst = GlobalConstant.WAGO_NB_COUNTERS_C)] 
    UInt32[] Counters; 
    [MarshalAs(UnmanagedType.I4, SizeConst = GlobalConstant.WAGO_NB_ENCODERS_C)] 
    Int32[] Encoders; 
    UInt32 Weight; 
    Boolean CalibrationValid; 
    Boolean LastCalibrationFailed; 
}; 

가 어떻게 오류없이 rigth 데이터를 얻을 수있는 C#을 구조체를 선언 할 : 여기

는 DLL 여기 .H

#define WAGO_NB_COUNTERS_C 80 
#define WAGO_NB_ENCODERS_C 10 

struct WAGO_DATA_TO_USER_T 
{ 
    unsigned int Counters[WAGO_NB_COUNTERS_C]; 
    int Encoders[WAGO_NB_ENCODERS_C]; 
    unsigned int Weight; 
    bool CalibrationValid; 
    bool LastCalibrationFailed; 
}; 

는 C# 구조체 선언이다?

감사


편집 :

내가 같이 구조체를 다시 작성했습니다 :

internal struct WAGO_DATA_TO_USER_T 
{ 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = GlobalConstant.WAGO_NB_COUNTERS_C)] 
    UInt32[] Counters; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = GlobalConstant.WAGO_NB_ENCODERS_C)] 
    Int32[] Encoders; 
    UInt32 Weight; 
    Boolean CalibrationValid; 
    Boolean LastCalibrationFailed; 
}; 

더 이상 오류가 있지만 값이 예상되지 않는 한.

Counter[0] = ~ 5000 
Counter[1] = ~ 30000 
Counter[2-79] = 0 

정말입니다 :

Counter[0] = 40 
Counter[1] = 1080228 
Counter[2] = 82964616 
Counter[3-79] = All have a non-zero value 
+0

다음 문제 : bool! = 부울입니다. [MarshalAs (UnmanagedType.I1)]이 필요합니다. –

답변

0

정렬 화는 정확하지만 호출 된 장치가 외부 관리되지 않는 DLL에 의해 초기화되지 않았습니다

는 같아야합니다. 그래서 uninitialisez 메모리가 유효하지 않은 데이터로 이어집니다.