簡體   English   中英

將C ++非托管代碼轉換為C#

[英]Convert C++ unmanaged code to C#

我試圖使用元帥在C#中使用C#DLL代碼工作。 它具有兩個結構,這些結構在導出的API中作為指針參數傳遞,但是在C#中給出的結構響應值的順序不正確。 而它在VC ++中可以正常工作。

//C++ Code - Working
//Structure 1
typedef struct
{
    bool    bExist;
    bool    bAvailable;
    int     iNoteNumber;
    int     iDispenseNumber;
    int     iOutNoteNumber;
    char    cStatus;
    char    acBoxID[6];
} tHopperStatus;
//Structure 2
typedef struct 
{
    char acCurrency[4]; 
    int lDenomination;  
    int iRemainCount;   
    int iCount; 
    int iOutCount;
    int iRejectCount;
    int iPurgeCount;    
    BYTE    byHopper;
    char    cStatus;
    char    cLastStatus;    
    char    acBoxID[6];
    BYTE    byBoxType;
    char    acReserved1[10];
    char    acReserved2[10];
    int iReserverd1;
    int iReserverd2;
} tCashBox;
//API using above two structures
int iGetCassette(tCashBox* p_psCashBox,tDevReturn* p_psStatus);

//Calling API by passing pointer of Structure Array  
tCashBox l_asBox[8] = {0};
tDevReturn l_asReturn[8] = {0};
int l_iRes = l_pDev->iGetCassette(l_asBox, l_asReturn);

我在C#中實現的內容:

//C# Code
//Structure 1
[StructLayout(LayoutKind.Sequential)]
unsafe public struct tDevReturn
{
    public tDevReturn(int param)
    {
        iLogicCode = 0;
        iPhyCode = 0;
        iHandle = 0;
        iType = 0;
        acDevReturn = new char[128];
        acReserve = new char[128];
    }
    public int iLogicCode;
    public int iPhyCode;
    public int iHandle;
    public int iType;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
    public char[] acDevReturn;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
    public char[] acReserve;
}
//Structure 2
[StructLayout(LayoutKind.Sequential)]
unsafe public struct tCashBox
{
    public tCashBox(int param)
    {
        acCurrency = new char[4];
        lDenomination = 0;
        iRemainCount = 0;
        iCount = 0;
        iOutCount = 0;
        iRejectCount = 0;
        iPurgeCount = 0;
        byHopper = 0;
        cStatus = '\0';
        cLastStatus = '\0';
        acBoxID = new char[6];
        byBoxType = 0;
        acReserved1 = new char[10];
        acReserved2 = new char[10];
        iReserverd1 = 0;
        iReserverd2 = 0;
    }
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public char[] acCurrency;
    public long lDenomination;
    public int iRemainCount;
    public int iCount;
    public int iOutCount;
    public int iRejectCount;
    public int iPurgeCount;
    public byte byHopper;
    public char cStatus;
    public char cLastStatus;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public char[] acBoxID;
    public byte byBoxType;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved1;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved2;
    public int iReserverd1;
    public int iReserverd2;
}

//API Import Declaration
[DllImport("xxxxxxxxxx.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int CDM_iGetCassette([In, Out] tCashBox[] p_psCashBox, [In, Out] tDevReturn[] p_psStatus);

//API Call - but filling up the structure array with random values and incorrect sequence
tDevReturn[] response = new tDevReturn[8];
tCashBox[] cashboxData = new tCashBox[8];
int ret = Wrapper.CDM_iGetCassette(cashboxData, response);

我懷疑,在C#中是否允許以這種方式傳遞結構數組,而在C ++中它正在工作。 如果有人可以幫助我,那將是一個很大的幫助。 提前致謝。

編輯:我將'lDenomination'的數據類型從long更改為int。 現在,數組的第一個元素已正確填充。 但是結構數組的其余七個元素沒有被填滿。

如果有人可以幫助我,如何創建結構數組,使所有元素依次存儲。

最終,通過以下更新的結構2解決了該問題:1.將“ lDenomination”的數據類型從long更改為int。 2.在結構布局參數中添加了Pack = 1和CharSet = CharSet.Ansi。

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct tCashBox
{
    public tCashBox(int param)
    {
        acCurrency = new char[4];
        lDenomination = 0;
        iRemainCount = 0;
        iCount = 0;
        iOutCount = 0;
        iRejectCount = 0;
        iPurgeCount = 0;
        byHopper = 0;
        cStatus = '\0';
        cLastStatus = '\0';
        acBoxID = new char[6];
        byBoxType = 0;
        acReserved1 = new char[10];
        acReserved2 = new char[10];
        iReserverd1 = 0;
        iReserverd2 = 0;
    }
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public char[] acCurrency;
    public int lDenomination;
    public int iRemainCount;
    public int iCount;
    public int iOutCount;
    public int iRejectCount;
    public int iPurgeCount;
    public byte byHopper;
    public char cStatus;
    public char cLastStatus;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public char[] acBoxID;
    public byte byBoxType;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved1;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved2;
    public int iReserverd1;
    public int iReserverd2;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM