中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實(shí)例講解

c#有自己的內(nèi)存回收機(jī)制,所以在c#中我們可以只new,不用關(guān)心怎樣delete,c#使用gc來(lái)清理內(nèi)存,這部分內(nèi)存就是managed memory,大部分時(shí)候我們工作于c#環(huán)境中,都是在使用托管內(nèi)存,然而c#畢竟運(yùn)行在c++之上,有的時(shí)候,(比如可能我們需要引入一些第三方的c++或native代碼的庫(kù),在Unity3d開發(fā)中很常見(jiàn))我們需要直接在c#中操縱非托管的代碼,這些non-managed memory我們就需要自己去處理他們的申請(qǐng)和釋放了, c# 中提供了一些接口,完成托管和非托管之間的轉(zhuǎn)換,以及對(duì)這部分內(nèi)存的操作。

創(chuàng)新互聯(lián)是一家集成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站頁(yè)面設(shè)計(jì)、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站設(shè)計(jì)公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗(yàn),以探求精品塑造與理念升華,設(shè)計(jì)最適合用戶的網(wǎng)站頁(yè)面。 合作只是第一步,服務(wù)才是根本,我們始終堅(jiān)持講誠(chéng)信,負(fù)責(zé)任的原則,為您進(jìn)行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場(chǎng)環(huán)境中,互促共生。

基本上有以下幾種:

1.managed memory-> unmanaged memory

比如在c#中調(diào)用第三方的某個(gè)c++庫(kù),庫(kù)中有個(gè)函數(shù)是void func(float * data, int length).我們需要傳入給data的就應(yīng)該是一個(gè)非托管的代碼(why?首先傳入托管的內(nèi)存,c#層很可能會(huì)把它gc掉,而c++還在使用,而且托管的mem它的指針地址可能會(huì)發(fā)生改變,因此直接傳給c++可能拿到的地址是錯(cuò)誤的)

代碼如下:

using System.Runtime.InteropServices;
float[] _managed_data =... // this is the c# managed data
GCHandle unmanaged_data_handle = GCHandle.Alloc(_managed_data, GCHandleType.Pinned); //這里將標(biāo)記_managed_data暫時(shí)不能被gc回收,并且固定對(duì)象的地址
func(unmanaged_data_handle.AddrOfPinnedObject(),_managed_data.Length);//這里將拿到非托管內(nèi)存的固定地址,傳給c++
unmanaged_data_handle.Free();//使用完畢后,將其handle free,這樣c#可以正常gc這塊內(nèi)存

2.un-managed memory->managed memory

在c++中返回一個(gè)un-managed mem給c#使用。有時(shí)需要在c++中分配一塊處理好的內(nèi)存,然后返回給c#來(lái)使用,如c++中某個(gè)接口 int func(int** data) (注意這里要使用指針的指針,因?yàn)閐ata是得到的結(jié)果)

IntPtr unmanaged_ptr=IntPtr.Zero; //定義這個(gè)c#中用來(lái)接收c++返回?cái)?shù)據(jù)的指針類型
int length = func(out unmanaged_ptr );//調(diào)用c++的函數(shù),使unmanaged_ptr指向c++里分配的內(nèi)存,注意這里用out ,才能與c++里面的**匹配。
byte[] managed_data = new byte[length];
Marshal.Copy(unmanaged_ptr, managed_data, 0, length);//將非托管內(nèi)存拷貝成托管內(nèi)存,才能在c#里面使用
Marshal.FreeHGlobal(unmanaged_ptr);//釋放非托管的內(nèi)存

3.在c#直接申請(qǐng)一個(gè)un-managed mem傳給c++

有時(shí)需要直接在c#開辟一塊非托管的內(nèi)存,傳給c++用,這塊內(nèi)存同樣可以在c#中用后銷毀。代碼如下

IntPtr unmanaged_data_prt = Marshal. AllocHGlobal(100);// 直接分配100 byte的內(nèi)存
func(unmanaged_data_prt);//傳給c++使用
Marshal.FreeHGlobal(unmanaged_data_prt);使用后銷毀非托管內(nèi)存

此外 Marshal類里面還有很多處理非托管內(nèi)存的方法。

備注

托管內(nèi)存和非托管內(nèi)存在c#里面可以互相自由的轉(zhuǎn)化,主要通過(guò)Marshal類和GCHandle類,編程時(shí)只要注意非托管的內(nèi)存一定要負(fù)責(zé)好釋放就可以了。感謝大家對(duì)創(chuàng)新互聯(lián)的支持。

當(dāng)前題目:C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實(shí)例講解
轉(zhuǎn)載來(lái)于:http://www.rwnh.cn/article20/jipoco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、靜態(tài)網(wǎng)站、小程序開發(fā)網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
白山市| 香港| 塔河县| 贡觉县| 淮滨县| 龙江县| 贵港市| 翁牛特旗| 铁岭市| 梁山县| 平陆县| 长武县| 马鞍山市| 汾阳市| 永昌县| 陆河县| 霍州市| 宁都县| 梓潼县| 万山特区| 河西区| 台东县| 康保县| 龙门县| 嫩江县| 百色市| 温泉县| 灵丘县| 宜丰县| 余干县| 肃宁县| 双城市| 安丘市| 庆阳市| 方城县| 湖北省| 绥棱县| 游戏| 扶绥县| 罗山县| 宣城市|