【2017年整理】C#调用非托管代码时参考(整理)

上传人:豆浆 文档编号:987662 上传时间:2017-05-24 格式:DOCX 页数:35 大小:74.29KB
返回 下载 相关 举报
【2017年整理】C#调用非托管代码时参考(整理)_第1页
第1页 / 共35页
【2017年整理】C#调用非托管代码时参考(整理)_第2页
第2页 / 共35页
【2017年整理】C#调用非托管代码时参考(整理)_第3页
第3页 / 共35页
【2017年整理】C#调用非托管代码时参考(整理)_第4页
第4页 / 共35页
【2017年整理】C#调用非托管代码时参考(整理)_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《【2017年整理】C#调用非托管代码时参考(整理)》由会员分享,可在线阅读,更多相关《【2017年整理】C#调用非托管代码时参考(整理)(35页珍藏版)》请在金锄头文库上搜索。

1、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=Get

2、CardErrorMessage)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=GetSmsSaveSta

3、tion)public static extern bool GetSmsSaveStation(ref int nStation);4. 传递结构体指针(C+ 填充)C+原型:struct NET_INFO_STRUCTDWORD nDurationTime; /持续时间 double nReceiveByte; /接收字节double nSendByte; /发送字节; BOOL NetGetConnectDetail(NET_INFO_STRUCT *lpNetInfo);C#引用public struct NET_INFO_STRUCTpublic uint nDurationTime

4、; /持续时间 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+ 来填

5、充)C+原型:struct UIM_BOOK_STRUCTint UimIndex;char szName15;char szPhone21;int ReadUimAllBook(UIM_BOOK_STRUCT lpUimBookItem,int nMaxArraySize);C#引用StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)/可以指定编码类型public struct UIM_BOOK_STRUCTpublic int UimIndex;MarshalAs(UnmanagedType.ByValTStr, SizeC

6、onst= 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_STRUCT20;int ret = Read

7、UimAllBook(p,p.Length);6. 注意问题类型不一致,会导致调用失败 ,(1) long 类型, 在 C+中是 4 字节的整数, 在 C#中是 8 字节的整数;(2) 字符串类型的设置不正确 ;以下是几个简单的 window 调用System.Security.SuppressUnmanagedCodeSecurity / We wont use this maliciouslyDllImport(User32.dll, CharSet=CharSet.Auto)public static extern bool ScreenToClient(IntPtr hWnd, ref

8、 System.Drawing.Point rect);System.Security.SuppressUnmanagedCodeSecurity / We wont use this maliciouslyDllImport(User32.dll, CharSet=CharSet.Auto)public static extern bool GetWindowRect(IntPtr hWnd, out System.Drawing.Rectangle rect);System.Security.SuppressUnmanagedCodeSecurity / We wont use this

9、maliciouslyDllImport(User32.dll, CharSet=CharSet.Auto)public static extern bool UnregisterClass(MarshalAs(UnmanagedType.LPTStr) string className, IntPtr instanceHandle);1. 如果函数只有传入参数, 比如:C/C+ Code 1. /C+中的输出函数2. int _declspec(dllexport) test(const int N)3. 4. return N+10;5. 对应的 C#代码为:C# Code 1. DllI

10、mport(test.dll, EntryPoint = #1)2. public static extern int test(int m);3. 4. private void button1_Click(object sender, EventArgs e)5. 6. textBox1.Text= test(10).ToString();7. 2. 如果函数有传出参数, 比如:C/C+ Code 1. /C+2. void _declspec(dllexport) test(const int N, int& Z)3. 4. Z=N+10;5. 对应的 C#代码:C# Code 1. D

11、llImport(test.dll, EntryPoint = #1)2. public static extern double test(int m, ref int n);3. 4. private void button1_Click(object sender, EventArgs e)5. 6. int N = 0;7. test1(10, ref N);8. textBox1.Text= N.ToString();9. 3. 带传入数组:C/C+ Code 1. void _declspec(dllexport) test(const int N, const int n, in

12、t& Z)2. 3. for (int i=0; i bytes.Length)/返回空return null;/分配结构大小的内存空间IntPtr structPtr = Marshal.AllocHGlobal(size);/将 byte 数组拷到分配好的内存空间Marshal.Copy(bytes, 0, structPtr, size);/将内存空间转换为目标结构object obj = Marshal.PtrToStructure(structPtr, type);/释放内存空间Marshal.FreeHGlobal(structPtr);/返回结构return obj;4、实际操作

13、: using System.Collections;using System.Collections.Generic;using System.Net;using System.Net.Sockets;byte Message = StructToBytes(new Operator(user,pass); / 将结构转换成字节数组TcpClient socket = new TcpClient();socket.Connect(ip,port);NetworkStream ns = Socket.GetStream();ns.Write(Message,0,Message.Length);

14、 / 发送byte Recv = new byte1024; / 缓冲int NumberOfRecv = 0;IList newRecv = new List();ns.ReadTimeout = 3000;trydo/ 接收响应NumberOfRecv = ns.Read(Recv, 0, Recv.Length);for (int i = 0; i NumberOfRecv; i+)newRecv.Add(Recv);while (ns.DataAvailable);byte resultRecv = new bytenewRecv.Count;newRecv.CopyTo(result

15、Recv, 0);Operator MyOper = new Operator();MyOper = (Operator)BytesToStruct(resultRecv, MyOper.GetType(); / 将字节数组转换成结构在这里取值的时候可能会出现只能取到一个字段,剩余的取不到的问题,怎么回事我也搞不懂,反正我的解决办法就是按照字节的顺序从 resultRecv 里分别取出对应的字段的字节数组,然后解码,例如: Operator.name 是 11 个字节,最后一位是 0,Operator.id 是 2 个字节,那么从第 3位到第 12 位的字节就是 Operator.name 的内容,取出另存为一个数组MyOperName,Encoding.Default.GetString(MyOperName) 就是MyOper.name 的内容。 /c+:HANDLE(void *) - c#:System.IntPtr /c+:Byte(unsigned char) - c#:System.Byte /c+:SHORT(short) - c#:Syste

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号