C DLLからC#アプリケーションにデータを取得する必要があります。ここにエラーがあります:
タイプ'KnittingWago.Common.WAGO_DATA_TO_USER_T'のフィールド'Counters'をマーシャリングできません:無効なマネージド/アンマネージドタイプの組み合わせ(配列フィールドは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#構造体を宣言するにはどうすればよいですか?
ありがとう
編集 :
Structを次のように書き直しました:
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