如何將C#數組傳給具有IntPtr的托管代碼函數?
来源:互联网 发布:mac ppt设置透明色 编辑:程序博客网 时间:2024/06/05 05:57
http://blog.csdn.net/photohomeli/article/details/4922757
來自CSDN的一個結貼:http://topic.csdn.net/u/20081018/02/4472adae-063c-4ea7-a4fa-369614656339.html
如何將C#數組(如bytes[])傳給具有IntPtr的托管代碼函數?---非unsafe
問題:
我在C#裡的數據存放在byte[]中,需要傳到某一函數中去,如下:
byte[] byData = new byte[1024];
......對byData進行賦值
// 完畢後,將該數組中的數據傳給該函數,該函數聲明如下
MyFunction(int iNo, IntPtr pData, uint nDataSizeinBytes);
// 該函數原形聲明中的pData就是用來存貯數據的
解決方法:
1:先申請一段非托管的內存空間,使用的方法是:
- C# code
IntPtr System.Runtime.InteropServices.Marshal.AllocHGlobal(int size);IntPtr hglobal = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
該函數傳入一個你要申請的空間大小,返回申請到的非托管內存指針hglobal。
2:把你的數據從byte[]復制到這段內存空間中。
復制字節流所使用的方法是:
- C# code
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]public static void System.Runtime.InteropServices.Marshal.Copy( byte[] source, int startIndex, IntPtr destination, int length)//示例System.Runtime.InteropServices.Marshal.Copy(byData,0,hglobal,byData.Length);
3:把步驟1取得的指針傳入你的非托管函數中。
- C# code
MyFunction(iNo, hglobal,byData.Length);
注意:
非托管內存需要自行釋放。你可以選擇在托管程序(C#)中釋放,方法是:
Marshal.FreeHGlobal(hglobal);
如果你在C#中釋放需要采用一種機制來由你的函數通知C#程序內存已經使用完成,不然將會造成不小的風險。
當然你也可以在非托管的程序中釋放,這就要看你的程序是否已經實現了釋放或者可以修改。
MSDN的一個頁面地址,中文的。
http://msdn.microsoft.com/zh-cn/magazine/cc164193.aspx
- 如何將C#數組傳給具有IntPtr的托管代碼函數?
- 如何将C#数组传给具有IntPtr的托管代码函数?
- C#中IntPtr的使用
- C# 的IntPtr 是什么东西?
- C# 调用C++非托管DLL, C++中的const char *对应C#中的IntPtr类型。
- C#中如何调用托管的DLL
- C#中的IntPtr使用
- C#中的IntPtr类型
- C#中的IntPtr类型
- C#中的IntPtr类型
- C#中的IntPtr使用
- C#中的IntPtr使用
- C#中的IntPtr类型
- C#中的IntPtr类型
- C#中的IntPtr类型
- C# IntPtr互转String
- C# 数组转Intptr
- c#的托管事件
- jsp中取得当前时间
- boost中的智能指针shared_ptr的指针管理
- C语言strrev函数
- Compressing my videos 我的视频压缩
- filezilla client代码阅读笔记(一)
- 如何將C#數組傳給具有IntPtr的托管代碼函數?
- 2013年第一季度中国移动互联网应用安全检测与分析报告
- 分享怎样在Win8系统的账号自动登录默认设置技巧
- shell读文件
- 关于typedef的一些用法总结
- vim 展开所有折叠代码
- Python编程语言
- 非常好看的JS网站客服列表
- 比特币权威问答