最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年08月26日 15:31:42   作者:menjiawan  
在本篇文章里小編給大家整理了關(guān)于C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例以及相關(guān)知識點,需要的朋友們學(xué)習(xí)下。

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

基本上有以下幾種:

1.managed memory-> unmanaged memory

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

代碼如下:

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暫時不能被gc回收,并且固定對象的地址
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++中返回一個un-managed mem給c#使用。有時需要在c++中分配一塊處理好的內(nèi)存,然后返回給c#來使用,如c++中某個接口 int func(int** data) (注意這里要使用指針的指針,因為data是得到的結(jié)果)

IntPtr unmanaged_ptr=IntPtr.Zero; //定義這個c#中用來接收c++返回數(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#直接申請一個un-managed mem傳給c++

有時需要直接在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)化,主要通過Marshal類和GCHandle類,編程時只要注意非托管的內(nèi)存一定要負(fù)責(zé)好釋放就可以了。感謝大家對腳本之家的支持。

相關(guān)文章

  • C# WinForm快捷鍵設(shè)置技巧

    C# WinForm快捷鍵設(shè)置技巧

    這篇文章主要給大家介紹C# winform快捷鍵設(shè)置技巧,涉及到C winform快捷鍵相關(guān)知識,對C winform知識感興趣的朋友可以參考下本篇文章
    2015-10-10
  • unity實現(xiàn)方向盤轉(zhuǎn)動效果

    unity實現(xiàn)方向盤轉(zhuǎn)動效果

    這篇文章主要為大家詳細(xì)介紹了unity實現(xiàn)方向盤轉(zhuǎn)動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 教你創(chuàng)建一個帶診斷工具的.NET鏡像

    教你創(chuàng)建一個帶診斷工具的.NET鏡像

    本文編寫的初衷是因為在群里有很多小伙伴遇到生產(chǎn)環(huán)境性能問題的時候,.NET的runtime鏡像中沒有帶一些工具,安裝和使用起來很麻煩,所以分享一些我們公司內(nèi)部一些技巧,對.NET鏡像帶診斷工具相關(guān)知識感興趣的朋友一起看看吧
    2022-07-07
  • 淺談C#2.0泛型中的變化:default關(guān)鍵字

    淺談C#2.0泛型中的變化:default關(guān)鍵字

    下面就詳細(xì)的說明一下。之所以會用到default關(guān)鍵字,是因為需要在不知道類型參數(shù)為值類型還是引用類型的情況下,為對象實例賦初值
    2013-09-09
  • 如何在C#中調(diào)用COM組件

    如何在C#中調(diào)用COM組件

    這篇文章主要介紹了如何在C#中調(diào)用COM組件,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用(下)

    C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用(下)

    本篇文章是對C#中ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C#調(diào)用matlab生成的dll庫

    詳解C#調(diào)用matlab生成的dll庫

    這篇文章主要介紹了C#調(diào)用matlab生成的dll庫,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • C#簡單數(shù)字圖像處理程序

    C#簡單數(shù)字圖像處理程序

    這篇文章主要為大家詳細(xì)介紹了C#簡單數(shù)字圖像處理程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 自定義實現(xiàn)Json字符串向C#對象轉(zhuǎn)變的方法

    自定義實現(xiàn)Json字符串向C#對象轉(zhuǎn)變的方法

    自定義實現(xiàn)Json字符串向C#對象轉(zhuǎn)變的方法,需要的朋友可以參考一下
    2013-03-03
  • NGUI實現(xiàn)滑動翻頁效果實例代碼

    NGUI實現(xiàn)滑動翻頁效果實例代碼

    本文通過一段實例代碼給大家介紹NGUI實現(xiàn)滑動翻頁效果,代碼簡單易懂,對ngui 滑動翻頁相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04

最新評論

和田市| 新竹市| 剑河县| 奉贤区| 会理县| 扶风县| 台北县| 阿荣旗| 顺昌县| 石门县| 巢湖市| 盐津县| 黄大仙区| 公主岭市| 新乐市| 彭水| 日照市| 河北省| 武隆县| 江阴市| 大理市| 洞头县| 隆子县| 姜堰市| 佛冈县| 梅州市| 武平县| 思茅市| 文水县| 怀化市| 泽普县| 凤冈县| 社会| 砀山县| 武鸣县| 观塘区| 临泉县| 康定县| 外汇| 枣强县| 太仓市|