C#呼叫vc++的動態庫
函式原型:int Test(char * pcInput, char* pcOutput)
pcInput結構:
typedef struct
{
char transypte[2];
char misNo [6];
char amount [12];
char cashier [8];
char bar_code [50];
char old_shop_code [50];
char old_cardback[4];
char old_trace [6];
char old_reference[8];
char old_date[8];
char old_time[6];
char TerNo[15];
char MerchNo [12];
char barcode_type [4];
} pcInput ;
pcOutput結構:
typedef struct
{
char transypte[2];
char misNo [6];
char amount [12];
char cashier [8];
char resp_code[2];
char rspinfo [100];
char mask_cardno [19];
char shop_code [50];
char barcode_type [4];
char pay_type;
char trace [6];
char reference [8];
char date[8];
char time[6];
char batch [8];
char TerNo[15];
char MerchNo [12];
char act_amt [12];
} OutPutData;
c# 中 宣告
[DllImport("test.dll", EntryPoint = "Test")]
public static extern int Test([MarshalAs(UnmanagedType.LPStr)]PcInfo data, [MarshalAs(UnmanagedType.LPStr)]ref OutData res);
PcInfo 結構:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct PcInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public string transypte;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string misNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string amount;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string cashier;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string bar_code;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string old_shop_code;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string old_cardback;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string old_trace;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string old_reference;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string old_date;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string old_time;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
public string TerNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string MerchNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string barcode_type;
}
OutData 結構:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct OutData
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string transypte;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string misNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string amount;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string cashier;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string resp_code;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string rspinfo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)]
public string mask_cardno;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string shop_code;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string barcode_type;
public char pay_type;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string trace;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string reference;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string date;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string time;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string batch;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
public string TerNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string MerchNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string act_amt;
}
然后呼叫會報錯:

這是什么原因啊,求解答。。沒分了

uj5u.com熱心網友回復:
應該是引數型別不匹配uj5u.com熱心網友回復:
我改成 public static extern int TransDo(IntPtr data, ref IntPtr res);
IntPtr infosIntptr = StructToIntPtr<PcInfo>(oc);
int sizeOut = Marshal.SizeOf(typeof(OutData));
IntPtr outptr = Marshal.AllocHGlobal(sizeOut);
int x = TransDo(infosIntptr, ref outptr);
var output = Marshal.PtrToStructure(outptr, typeof(OutData));
public static IntPtr StructToIntPtr<T>(T info)
{
int size = Marshal.SizeOf(info);
IntPtr intPtr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(info, intPtr, true);
return intPtr;
}
這樣 不報那個錯了,dll也有日志輸出,然后拿回傳值的時候 報錯了
uj5u.com熱心網友回復:
int Test(char * pcInput, char* pcOutput) 轉換有問題可直接宣告為 int Test(IntPtr pcInput, IntPtr pcOutput);
然后使用時將引數結構體轉換為指標就好了
uj5u.com熱心網友回復:
如果是我,我就簡單的使用string 用于input應該是用于輸入, StringBuilder 用于 output,應該是回傳結果的,如果使用結構體的話,所有的char[] 都不要使用string,照原來的char[]使用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/245455.html
標籤:C#
上一篇:新手請教c#進度條實作方式
下一篇:.net websocket.ReceiveAsync 設定超時任務不起作用 CancellationTokenSource
