У меня есть C++ структура ниже:Marshalling C++ структура с междунар * член в C#
struct CTMDeviceError {
struct CTMDeviceInfo sDeviceInfo;
int32_t iResultCode;
int32_t iExtendedResultCode;
int32_t * piDenomination;
int32_t * piChangeDue;
};
Я создал эквивалент C# структуру, но у меня возникают проблемы сортировочных типа int32 *.
[StructLayout(LayoutKind.Sequential)]
public struct CTMDeviceError
{
public CTMDeviceInfo deviceInfo;
[MarshalAs(UnmanagedType.I4)]
public Int32 resultCode;
[MarshalAs(UnmanagedType.I4)]
public Int32 extendedResultCode;
public ??? denomination;
public ??? changeDue;
};
Я попытался использовать IntPtr или Int32 [], но Visual Studio показывает ошибки несоответствия. Могу ли я получить совет? Спасибо!
Это остальные детали структуры:
C++
struct CTMDeviceInfo {
enum CTMDeviceType eDeviceType;
char * szDeviceModel;
char * szDeviceSubModel;
int32_t * piDeviceID;
};
enum CTMDeviceType {
CTM_DEVICETYPE_CASHCHANGER = 5,
CTM_DEVICETYPE_CASHACCEPTOR = 15,
CTM_DEVICETYPE_COINACCEPTOR = 16,
CTM_DEVICETYPE_OTHER = 17
};
C#
[StructLayout(LayoutKind.Sequential)]
public struct CTMDeviceInfo
{
public CTMDeviceType deviceType;
[MarshalAs(UnmanagedType.LPStr)]
public string deviceModel;
[MarshalAs(UnmanagedType.LPStr)]
public string deviceSubModel;
public ??? deviceId;
};
public enum CTMDeviceType
{
CTM_DEVICETYPE_CASHCHANGER = 5,
CTM_DEVICETYPE_CASHACCEPTOR = 15,
CTM_DEVICETYPE_COINACCEPTOR = 16,
CTM_DEVICETYPE_OTHER = 17
};
Если я использую Intptr, exe просто потерпит крах и отправит мне длинный отчет об ошибке, который я не понял. Если я использую [MarshalAs (UnmanagedType.I4)] публичное объявление Int32 [], это дает мне это => Необработанное исключение типа «System.TypeLoadException» произошло в Unknown Module. Дополнительная информация: Невозможно вывести поле «deviceInfo» типа «CTMOnCSharp.CTMDeviceError»: определение типа этого поля содержит информацию о макете, но имеет недопустимую комбинацию управляемых/неуправляемых типов или не может быть изменена. – aljochimera
Я попытался использовать [MarshalAs (UnmanagedType.LPArray)] public System.IntPtr changeDue, но я все еще получил ошибку несоответствия. Может быть, мой формат неправильный. – aljochimera