• VB.NET 指针


    在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等。

     '使用<StructLayout(LayoutKind.Sequential)>属性告诉net编译器:结构的元素在内存中按其出现的顺序排列 
     <StructLayout(LayoutKind.Sequential)> _ 
     Public Structure DEFUDT_Test 
     Public bytb As Byte 
     Public i32a As Int32 
     End Structure 
     
     Public Function fnGetIntptr1() As IntPtr 
     '取得一个4字节数组指针 
     Dim tabytTest(3) As Byte 
     '以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变。 
     Dim thObject As GCHandleGCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned) 
     Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() '取得指向字节数组的指针 
     
     '取得一个指向32位内存数据的指针, 
     '由于使用gchandle取指针的方法只能对引用的对象有效, 
     '所以对如int32等值类型必须使用将其封装成为一个对象的方法以变为引用类型 
     Dim ti32Test As Object = Convert.ToInt32(0) 
     '以下语句告诉net垃圾回收进程不对ti32test进行处理,也就是说ti32Test的内存位置固定不变。 
     Dim thObject1 As GCHandleGCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned) 
     Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() '取得ti32Test的首地址 
     
     Dim tudtTest1 As DEFUDT_Test 
     '由于结构是一种值类型变量,为保证指针申请方便,我们申请 
     '取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了 
     '由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小 
     Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte 
     Dim thObject2 As GCHandleGCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned) 
     Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() '取得指向结构的指针 
     
     '在这儿你可以写对指针处理的任意代码(在例2中会给予补充)…… 
     
     '在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理 
     If thObject.IsAllocated Then 
     thObject.Free() 
     End If 
     If thObject1.IsAllocated Then 
     thObject1.Free() 
     End If 
     If thObject2.IsAllocated Then 
     thObject2.Free() 
     End If 
     End Function

    上例中VB.NET指针流程处理可以归纳为:
    1、定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)
    2、使用GCHandle.Alloc方法将变量的内存区域固定下来。
    3、使用GCHandle对象的AddrOfPinnedObject取得该内存区域的首地址并赋值给指针变量.
    4、对指针进行操作
    5、使用GCHandle对象的free方法释放指针指向的内存区域以便NET垃圾回收器可以回收这个内存空间
    6、VB.NET指针所指向数据的存取

    在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指针所表示的地址中写入XXX类型的数据,而ReadXXX中作用就是将VB.NET指针所在地址的数据以XXX类型方式读出。

  • 相关阅读:
    idea--不能启动问题
    linux--mysql5.7安装
    vmware
    debezium
    java枚举
    springfox
    日志级别
    lombok--知识点
    es6--箭头函数
    网址访问过慢
  • 原文地址:https://www.cnblogs.com/lbnnbs/p/4782071.html
Copyright © 2020-2023  润新知