2012-10-05 286 views
0

我需要从C DLL获取数据到C#应用程序。以下是错误:将数据类型从C(非托管)映射到C#(托管)

不能键入“KnittingWago.Common.WAGO_DATA_TO_USER_T”的编组场“计数器”:无效托管/非托管型组合(阵列字段必须与ByValArray或的SafeArray成对出现)。

这里是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#struct声明:

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

如何声明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!= Boolean。 [MarshalAs(UnmanagedType.I1)]必需。 –

回答

0

编组是正确的,但我打电话的设备不是由外部非托管的DLL初始化。所以我正在读uninitialisez内存,导致这个无效数据