如何將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


原创粉丝点击