2014-11-26 2 views
-2

У меня есть 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 
    }; 
+0

Если я использую Intptr, exe просто потерпит крах и отправит мне длинный отчет об ошибке, который я не понял. Если я использую [MarshalAs (UnmanagedType.I4)] публичное объявление Int32 [], это дает мне это => Необработанное исключение типа «System.TypeLoadException» произошло в Unknown Module. Дополнительная информация: Невозможно вывести поле «deviceInfo» типа «CTMOnCSharp.CTMDeviceError»: определение типа этого поля содержит информацию о макете, но имеет недопустимую комбинацию управляемых/неуправляемых типов или не может быть изменена. – aljochimera

+0

Я попытался использовать [MarshalAs (UnmanagedType.LPArray)] public System.IntPtr changeDue, но я все еще получил ошибку несоответствия. Может быть, мой формат неправильный. – aljochimera

ответ

1

тип для указателей должны быть System.IntPtr.

+0

Я просто попробовал, но это не сработало. Приложение разбилось. VS дал мне длинный отчет об ошибке, который я не понял. Благодаря! – aljochimera

+1

Вы уверены, что ошибки связаны с IntPtr? DeviceInfo больше похоже, что это может быть преступником. – nvoigt

+0

Я обновил описание с добавленной информацией о структуре. – aljochimera

Смежные вопросы