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
下一个问题:bool!= Boolean。 [MarshalAs(UnmanagedType.I1)]必需。 –