[英]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.