C#调用C++编写的DLL函数各种参数传递问题
----在網上查了一個星期,終于找到解決方法
1. 不返回值的參數
C++ 原型:
bool??? SendNewSms(char *szTel, char *szMessage);
C#引用;
[DllImport( "CdmaCard.dll",EntryPoint="SendNewSms")] public???? static???? extern??? bool SendNewSms(string phone,string msg);
2. 帶返回值(char *)
C++原型:
BOOL GetCardErrorMessage(char *szErrorMessage , int errorCode);
C#引用
[DllImport( "CdmaCard.dll",EntryPoint="GetCardErrorMessage")] ???? public???? static???? extern??? int GetCardErrorMessage(StringBuilder msg,int errorCode);
StringBuilder buf = new StringBuilder(1024);//指定的Buf大小必須大于可能的最大長度 ?????? GetCardErrorMessage(buf,1);
3. 帶返回值(其他類型)
C++原型:
?? BOOL GetSmsSaveStation (int *nSmsStation);
C#引用
?? [DllImport( "CdmaCard.dll",EntryPoint="GetSmsSaveStation")] ??? public??? static??? extern?? bool GetSmsSaveStation(ref int nStation);
4. 傳遞結構體指針(C++填充) C++原型: struct NET_INFO_STRUCT { ?? DWORD nDurationTime; //持續時間 ?? double nReceiveByte; //接收字節 ?? double nSendByte;?? //發送字節 };? BOOL NetGetConnectDetail(NET_INFO_STRUCT *lpNetInfo); C#引用 ? public struct NET_INFO_STRUCT { ?? public uint nDurationTime; //持續時間 ?? public double nReceiveByte; //接收字節 ?? public double nSendByte;?? //發送字節 } [DllImport( "CdmaCard.dll",EntryPoint="NetGetConnectDetail")] ???????? public??? static??? extern?? int NetGetConnectDetail(ref NET_INFO_STRUCT pNetInfo); ??????? ???????? NET_INFO_STRUCT netInfo = new NET_INFO_STRUCT(); ???????? NetGetConnectDetail(ref netInfo);
??????? 5. 傳遞結構體數組(C++來填充) C++原型: struct UIM_BOOK_STRUCT { ?? int UimIndex; ?? char szName[15]; ?? char szPhone[21]; }; int ReadUimAllBook(UIM_BOOK_STRUCT lpUimBookItem[],int nMaxArraySize);
C#引用 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]//可以指定編碼類型 public struct UIM_BOOK_STRUCT { ?? public int UimIndex; ?? [MarshalAs(UnmanagedType.ByValTStr, SizeConst= 15)] ?? public string szName; ?? [MarshalAs(UnmanagedType.ByValTStr, SizeConst= 21)] ?? public string szPhone; };
[DllImport( "CdmaCard.dll",EntryPoint="ReadUimAllBook")] public??? static??? extern?? int ReadUimAllBook([Out] UIM_BOOK_STRUCT [] lpUimBookItem,int nMaxArraySize);
UIM_BOOK_STRUCT[] p = new UIM_BOOK_STRUCT[20]; int ret = ReadUimAllBook(p,p.Length);
6. 注意問題 類型不一致,會導致調用失敗, (1) long 類型,在C++中是4字節的整數,在C#中是8字節的整數; (2) 字符串類型的設置不正確;
轉載于:https://www.cnblogs.com/kun91101/p/3190891.html
總結
以上是生活随笔為你收集整理的C#调用C++编写的DLL函数各种参数传递问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NSLocalizedString不起作
- 下一篇: 中国军队一个连多少人?