управляемая подпись PInvoke не соответствует неуправляемой целевой подписи

У меня возникли проблемы при переносе этого кода взаимодействия с VB6 на C#.

VB6:

Type Dpi_t
    dpiDrSuPsd(DPI_PRG_LEN) As Byte
    dpiMyPort               As Long
    dpiHostAdr(DPI_MAX_HOST) As Byte
    dpiHostCnt              As Integer
    dpiVoidCom              As Long
    dpiRspBdy               As Long
    dpiCmData               As Long
    dpiRdcxData             As Long
    dpiLstErr               As Long
    dpiONoUa                As Byte
    dpiOTooMuch             As Byte
    dpiOBar                 As Byte
    dpiVPin                 As Byte
    DpiPin                  As Long
    dpiCda(DPI_CDA_LEN)     As Byte
    dpiEcCyc(DPI_CYC_LEN)   As Byte
    dpitemp(6000)           As Byte
End Type

C#

    [StructLayout(LayoutKind.Sequential)]
    public struct Dpi_t
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DPI_PRG_LEN)]
        public byte[] dpiDrSuPsd;
        public long dpiMyPort;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DPI_MAX_HOST)]
        public byte[] dpiHostAdr;
        public int dpiHostCnt;
        public long dpiVoidCom;
        public long dpiRspBdy;
        public long dpiCmData;
        public long dpiRdcxData;
        public long dpiLstErr;
        public byte dpiONoUa;
        public byte dpiOTooMuch;
        public byte dpiOBar;
        public byte dpiVPin;
        public long DpiPin;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DPI_CDA_LEN)]
        public byte[] dpiCda;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DPI_CYC_LEN)]
        public byte[] dpiEcCyc;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6000)]
        public byte[] dpitemp;
    }

Я не могу заставить их совпадать, и у меня просто закончились идеи. Что вы думаете, ребята?


person GaiusSensei    schedule 05.01.2012    source источник


Ответы (1)


Я никогда не выполнял взаимодействие VB6 с С#. Но я думаю, что вы используете неправильные типы данных С# в своей структуре .Net.

Согласно этому обзору Visual Basic 6.0 типы данных а

  1. VB6 Integer имеет размер 2 байта и
  2. VB6 Long имеет размер 4 байта.

Таким образом, для VB6 Integer вы должны использовать тип данных short (Int16), а для Long вы должны использовать тип данных int (Int32).

Надеюсь это поможет.

person Hans    schedule 05.01.2012