подпись управляемого PInvoke не совпадает с неуправляемой целевой подписью - PullRequest
0 голосов
/ 05 января 2012

У меня проблемы с переносом этого кода взаимодействия с 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;
    }

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

1 Ответ

2 голосов
/ 06 января 2012

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

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

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

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

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

...