2012-01-05 6 views
0

У меня возникают проблемы, когда я портировал этот Interop код из VB6 в C#управляемая PInvoke подпись не соответствует неуправляемой целевой подписи

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; 
    } 

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

ответ

2

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

Согласно этому summary из основных типов визуальных данных 6,0

  1. VB6 Integer 2 байта в размере и
  2. VB6 Long составляет 4 байт.

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

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

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