我的C#程序里有byte[],现在我要把该数组里的数据传给某函数,该函数的参数是IntPtr类型的,怎么办?谢谢
解决方案 »
- [原创]进程间通信的一个方法
- WPF button,判断鼠标点击有ispressed,判断touch要怎么办?
- rdlc图表问题(宽度、值)
- C# WinForm 分层
- C#中一个奇怪的问题,请高手解决!
- asp.net如何连接远程的ORACLE 数据库,用安装ORALCE 客户端吗?
- 在C#中怎么把int类型输出为2进制形式?16进制的呢?
- 在用.NET 2005 中采用DES加密算法时出现的错误:指定键的大小对于此算法无效
- 哪有visual c#.net最好是中文下载,要好用的,100分酬谢!!!!!!!!!
- 出现在application.run()的System.NullReferenceException异常
- C#中怎样自绘按钮
- 再来一贴100 求Session 过期
......对byData进行赋值// 完毕后,将该数组中的数据传给该函数,该函数声明如下
MyFunction(int iNo, IntPtr pData, uint nDataSizeinBytes);
// 该函数原形声明中的pData就是用来存贮数据的
1:先申请一段非托管的内存空间,使用的方法是:IntPtr System.Runtime.InteropServices.Marshal.AllocHGlobal(int size);
IntPtr hglobal = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);该函数传入一个你要申请的空间大小,返回申请到的非托管内存指针hglobal。2:把你的数据从byte[]复制到这段内存空间中。
复制字节流所使用的方法是:[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取得的指针传入你的非托管函数中。
MyFunction(iNo, hglobal,byData.Length); 注意:
非托管内在需要自行释放。你可以选择在托管程序(C#)中释放,方法是:
Marshal.FreeHGlobal(hglobal);
如果你在C#中释放需要采用一种机制来由你的函数通知C#程序内存已经使用完成,不然将会造成不小的风险。
当然你也可以在非托管的程序中释放,这就要看你的程序是否已经实现了释放或者可以修改。
http://msdn.microsoft.com/zh-cn/magazine/cc164193.aspx
例如:byte[,] bytes = new byte[256,1024];