我花了1天的時間來找出這個問題發生的原因,但結果仍然失敗。 當我在本機DLL中調試時,它顯示第二個參數的錯誤指針。需要這裏的專家來建議在我的步驟中缺少產生此錯誤的內容。PInvoke編組結構和BYTE *作爲參數導致壞指針
- 母語STRUCT
typedef struct { BYTE bcdTicketMainType; BYTE bcdTicketSubType; BYTE bcdValidityStartDate[4]; // YYYYMMDD BYTE bcdValidityEndDate[4]; // YYYYMMDD BYTE bcdPhysicalExpiryDate[4]; // YYYYMMDD BYTE bFareZone; SHORT sDepositAmount; // NEW ARGUMENT LONG lBalance; // NEW ARGUMENT BYTE bcdStationIDOrigin[2]; BYTE bcdStationIDDestination[2]; BYTE bcdPaymentType; CHAR strPaymentMediaID[20]; CHAR strAgentID[8]; BYTE bcdShiftID; } T_TK_KTMB_CSC_SALE_INFO;
- 結構在C#
public struct T_TK_KTMB_CSC_SALE_INFO { public byte bcdTicketMainType; // 1 public byte bcdTicketSubType; // 1 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] bcdValidityStartDate; // YYYYMMDD [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] bcdValidityEndDate; // YYYYMMDD [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] bcdPhysicalExpiryDate; // YYYYMMDD public byte bFareZone; public short sDepositAmount; // NEW ARGUMENT public long lBalance; // NEW ARGUMENT [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] bcdStationIDOrigin; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] bcdStationIDDestination; public byte bcdPaymentType; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 20)] public char[] szPaymentMediaID; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 8)] public char[] szAgentID; public byte bcdShiftID; }
- 固有函數
INT KTMBBiz_CSCSale(T_TK_KTMB_CSC_SALE_INFO CSCSaleInfo,BYTE * pbTranxData);
在C#
[的DllImport( 「KTMBBizRule.dll」)] 公共靜態外部INT KTMBBiz_CSTSale([IN,OUT的MarshalAs(UnmanagedType.LPArray,SizeParamIndex => 127功能)] byte [] pbTranxData,T_TK_KTMB_CST_SALE_INFO CSTSaleInfo);稱爲在C#
功能
private void btnCscSale_Click(object sender, EventArgs e) { T_TK_KTMB_CSC_SALE_INFO cscSale = new T_TK_KTMB_CSC_SALE_INFO(); byte[] trxData = new byte[2]; BizRule.KTMBBiz_CSCSale(cscSale, trxData); }
- 錯誤創建於本機C++
您的C#函數聲明有兩個參數交換。 –