VB.NET中指针和非托管内存的应用

OCCTProxy:为.NET开发者量身定制的OpenCASCADE C++/CLI桥梁 OCCTProxy是一个专为.NET开发者设计的C++/CLI代理库,它构建了连接OpenCASCADE几何内核与.NET生态的高效桥梁。本文深入解析了其作为最佳粘合剂的原理,并通过WPF集成、参数化建模、数据转换等实战场景,展示了如何安全、高效地在C#应用中调用OCCT的强大3D功能,大幅提升开发效率。 阅读详情
介绍

Visual Basic 从来不像在C或C++里一样灵活的操纵指针和原始内存。然而利用.NET框架中的structures 和 classes,可以做许多类似的事情。它们包括 IntPtr, Marshal 以及 GCHandle。 这些structures 和classes 允许你在托管和非托管环境中进行交互。本文中,我 将向您展示如何使用这些structures 和 classes 去完成指针和内存的操作。尽管是VB.NET的代码,转换成 C# 应该也不会有问题。同时注意,为了简明,我没有提供实际的非托管代码,我的目标是讲解如何让它们应用到每一个独立的需求中。

关于 IntPtr structure

IntPtr structure 的行为像一个整型指针以便能应用到专门的平台。这个 structure 可以应用到支持或不支持指针的语言中。 .NET 文件 IO 类使用这个 structure 扩展操作文件句柄。

关于 Marshal 类

这个 IntPtr structure 形如整型指针的行为,但是它没有写或读相应位置内存的能力。这时你就需要System.Runtime.InteropServices 命名空间中的 Marshal 类。这个类提供了全部分配非托管内存、拷贝非托管内存块,以及转换托管到非托管类型的方法。要保证你的代码导入了 System.Runtime.InteropServices 。

关于 GCHandle structure

GCHandle structure 提供了从非托管内存中处理托管对象的方法。在非托管代码使用它时,可以控制垃圾碎片收集。

整数值的读写

在我们的第一个例子中,使用Marshal类在内存中储存一个整数,得到一个指针去指向它,并存到一个 IntPtr 结构中。最终我们将使用Marshal 类读回这个值。

这里我们声明一个IntPtr类型,并且使用Marshal类中的AllocHGlobal 共享方法从全局堆中分配一个4字节的内存,并返回它的地址,存储在 IntPtr 变量中。接下来我们使用Marshal类中的WriteInt32 方法将整数值写到内存中。

用下面的方法,你可以读指定位置的内存。

字符串的读写

在这个例子中,我们写一个托管字符串到堆中,并且随后读出来。

这里,我们使用了Marshal类中的StringToHGlobalAuto()方法拷贝托管字符串到非托管内存中。我们将内存地址保存在 IntPtr 结构中。为了从指定内存位置读回字符串,我们使用Marshal类中的PtrToStringAuto()方法 。

结构的读写

在下一个例子中,我们将看到如何使用Marshal 类和 IntPtr 结构,进行structure的读写。

这里我们使用一个名为Point的结构。这个代码和例子1中的相似,但要注意,我们使用了Marshal类中SizeOf method方法返回结构变量的尺寸。 方法StructureToPtr 接收要被写的结构变量,一个IntPtr 实例将被返回,同时标明是否Marshal类应该调用 DestroyStructure 方法,建议标记为 True,如果标记为 false 可能导致内存泄漏。最后我们使用Marshal累得PtrToStructure方法对会结构的值。

对象的读写

现在我们了解了如何用Marshal和IntPtr类读写值类型。托管对象的处理稍微不同。需要使用 GCHandle 来读写这些对象,下面的代码显示如何做:

这里,对于employee类我们使用GCHandle (碎片手机句柄) 类进行分配和释放内存。共享(静态)的 Alloc 方法接受对象并存储在内存中并一个 GCHandle 类的实例。我们可以使用这个对象的Target属性指向对象的引用。我们可以使用GCHandle实例的Free方法来销毁相应的内存。

总结

在VB.NET中使用指针和非托管操作并不是易事,然而 IntPtr ,GCHandle 结构 和 Marshal 类可以让你完成类似的事情。

作者
Bipin Joshi
Bipin Joshi BinaryIntellect Consulting 的所有者,在那里他提供了许多关于 .NET 技术的训练程序。

 


深入解析VB-DLL内存管理技术与实战优化 除了依赖外部工具,还可通过代码层面植入监控机制,提升问题发现效率。方案实时性精度部署难度适用场景WinDbg高极高高深度故障排查高中低生产环境监控日志计数器中高中开发测试期埋点内存快照中中中长期趋势分析多种手段协同使用,才能实现全面覆盖。 阅读详情

相关推荐

基于VC++/CLI的Windows窗体简易计算器应用开发实战

在数学运算中,乘除优先于加减,而相同优先级的操作通常遵循左结合原则(即从左向右执行)。例如,在表达式8 / 4 / 2中,应先执行8 / 4 = 2,再执行2 / 2 = 1,而非先算右侧。这种行为由两个属性决定:优先级(precedence)和结合性(associativity)。运算符优先级结合性()43左结合2左结合括号具有最高优先级,但不参与实际运算,仅用于控制分组。值得注意的是,一元负号(如-5。

weixin_42601702的博客 496

[VB.Net]获取对象的指针及结构体与字节数组间的相互转化

参考网上的方法,使用了GCHandle,http://blog.csdn.net/gxwxca/archive/2007/04/26/1585496.aspx,他的文章写得有点复杂,其实就是下面的两行Dim GCH As GCHandle = GCHandle.Alloc(对象, GCHandleType.Pinned) Dim tPtr As IntPtr = GCH.AddrOfPinnedObject

tzwsoho的专栏 3373

如何:在VB.NET中显示指定文件的图标?

如何:在VB.NET中显示指定文件的图标?如何:在VB.NET中显示指定文件的图标?如何:在VB.NET中显示指定文件的图标?

vb.net 怎么接收返回的Intptr类型的数据呢,求指教

声明一个C写的函数: Declare Auto Function seat_arrange Lib "mydll.dll" Alias "seat_arrange" (ByRef Seat_strategy() As StructClass.StructClass.Seat_strategy, ByVal strategy_Num As Integer, ByVal Solu...

weixin_33762130的博客 1261

关于Kswapd的理解(一)

关于Kswapd的理解(一) 之前跟踪了MemAvailable的计算方式,其中watermark的计算花了很多精力,在学习的过程中看到一些资料中说watermark是给swapd使用的,于是乎,研究一下看看咯 本部分主要记录两个方面: 对于kswapd这个东西,从初学者(我)的角度出发会考虑哪些内容? 跟踪kswapd 初始化结构部分; 1. KSwapd机制 上图是还没有跟踪kswapd code的时候,对自己提出的一些疑问和自身的理解,主要是如下内容: kswapd 机制用来做什么:内存不足时

And乔的博客 2706

医学图像标注工具教程——从零开始使用3D Slicer进行医学图像手动分割

3D Slicer手动分割软件下载及安装数据导入导入CT序列文件夹导入单张超声基本交互操作窗位和窗宽的调整改变切片及寻找特定点对应的三维切片图像分割功能介绍PaintDrawEraseLevel tracingGrow from seedsFill between slicesThreshold & Margin & HollowSmoothingScissors & IslandsLogical operator分割结果的保存 软件下载及安装 下载地址:官网的4.11.0版本 数据

神仙院B栋4楼保安的博客 1万+

C#【高级篇】 IntPtr是什么?怎么用?

在C#编程中,当调用C++写的dll时,有时会用到IntPtr,那IntPtr是什么,又怎么用呢?

星Yeah 的博客 4万+

verilog CORDIC对数运算

verilog CORDIC对数运算

m0_64355812的博客 1732

在VB.Net中使用指针

 例1:以下程序我们申请几个指向不同类型的指针:’使用属性告诉net编译器:结构的元素在内存中按其出现的顺序排列 _Public Structure DEFUDT_Test Public bytb As Byte Public i32a As Int32End StructurePublic Function fnGetIntptr1() As IntPtr ’取得一个4字节数组指针 Di

gxwxca的专栏 6203

哈密顿-雅可比不等式:连接最优控制与优化算法的自然物理原理

在控制理论与优化算法之间,存在一个深刻而实用的桥梁。最优控制理论旨在通过设计控制输入,使动态系统在时间维度上达到性能最优,其核心数学工具如庞特里亚金极大值原理和哈密顿-雅可比-贝尔曼方程,为解决连续时间系统的优化问题提供了优雅框架。然而,这些方法在高维非凸问题中面临求解难题。哈密顿-雅可比不等式作为一种松弛方法,通过构造李雅普诺夫函数并验证一个不等式条件,转而寻求性能有保障且易于实现的次优解,其本质是保证系统能量衰减和性能上界。这一原理与耗散性理论紧密相连,体现了自然物理系统(如阻尼振动)中能量耗散的普遍规

weixin_30582943的博客 310

【STK】手把手教你利用STK进行进行光电红外仿真02-STK/EOIR模块属性之一 传感器选项设置

EOIR传感器可以从空间几何属性、光谱属性、光学属性、辐射属性四个方面进行设置,并且可以设置信号传播路径中的大气特性,包括大气模型、气溶胶模型、气象学可见性和大气湿度。在定义EOIR传感器时,需要Sensor——Definition属性页中,将Sensor Type设置为EOIR。单击下面的按钮打开传感器的EOIR配置页,可以对传感器的属性进行配置,此外,还可以在场景中视情况添加相关的中心体。路径辐射损耗影响上述特性的计算,计算的结果考虑了传感器、目标位置的影响,但是还没考虑地球临边背景的影响。

weixin_44184852的博客 3193

VB.NET 指针

在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等。 '使用<StructLayout(LayoutKind.Sequential)>属性告诉net编译器:结构的元素在内存中按其出现的顺序排列 <StructLay...

weixin_34107955的博客 999

把 LDB 讲透:SAP ABAP 逻辑数据库的结构、事件模型、动态选择与现代替代方案

摘要:SAP中的Logical Database(LDB)是一种将表组织成树形结构并统一生成选择屏幕的技术,通过事件驱动方式向报表程序传递数据。虽然被标记为过时,但在理解标准代码和优化性能方面仍有价值。LDB通过SE36事务码创建,其结构包含层级关系、选择屏幕和数据库程序。报表通过NODES声明和GET事件处理数据,支持动态选择以减少数据库访问。在S/4HANA和ABAP Cloud环境下,建议使用CDS View和ABAP SQL等现代方案替代LDB,以提升可测试性和架构清晰度。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 205

VB.NET 内存指针和非托管内存的应用

介绍 Visual Basic 从来不像在C或C++里一样灵活的操纵指针和原始内存。然而利用.NET框架中的structures 和 classes,可以做许多类似的事情。它们包括 IntPtr, Marshal 以及 GCHandle。 这些structures(结构) 和classes(类) 允许你在托管和非托管环境中进行交互。本文中将向您展示如何使用这些structures 和 ...

weixin_30740581的博客 283

coredump文件的原理是啥

Core Dump(核心转储)是操作系统在程序崩溃(如段错误、非法指令等)时自动生成的一个文件,它包含了程序崩溃瞬间的。通过 core dump,开发者可以像“时间回溯”一样检查程序崩溃瞬间的状态,是调试复杂问题的利器!终止时,Linux 内核会生成 core 文件。不会生成 core dump,因为它们是“优雅终止”信号。这样 core 文件会直接压缩存储,节省磁盘空间。的文件(类似可执行文件),可以用。Core 文件本质上是一个。

二进制君 361

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

本文主要介绍了AttributeError: module ‘lib’ has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK’解决方案,希望能对使用python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

vb.net用Marshal类在内存中处理图像

vb.net操作不了指针,只能用marshal类来进行托管内存和非托管内存之间的交互,但是这样也依然比用GetPixel和SetPixel速度快。 讲之前先介绍一些方法的用法 Bitmap.LockBits 方法 定义如下: Public Function LockBits (rect As Rectangle, flags As ImageLockMode, format As PixelFor...

weixin_42150685的博客 1300

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

学习笔记:银江数据源在.net下的使用方法(marshal类在框架下调用非框架dll中的使用)

为了解股票实时行情的接收,使用银江的股票数源做为接收程序的数据源,开发环境为vs2010,语言为vb.net, 数据源: 使用银江的数据源其编写代码为dephi,工作原理是,在接收到数据后向接收程序主消息窗体发送消息,来通知程序处理数据。 消息结构为: typedef struct tagRCV_DATA { int m_wDataType; // 文件类型 int

淡定 4623

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB中的P/Invoke(Platform Invocation Services)机制以及它如何用于调用非托管代码

在托管代码中,你需要使用。

2402_85246552的博客 507

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

vb重构c++项目

最近做一个重构项目,库是vb,有旧代码程序,要求做成mfc程序,中间遇上的问题就放在这里吧。 1、vb工程中,Frm_xxx.vb应该是界面文件,打开之后可以看到类似于mfc的界面,双击打开响应函数。 2、Marshal.PtrToStructure 函数找了很久,查资料是“将数据从非托管内存块封送到新分配的指定类型的托管对象。”,以前做c++没注意过,顺便了解了一下托管内存与

简单 553

VB.Net内存管理与内存释放的方法

引言 托管代码的内存管理是自动的,.NET可以保证我们的托管程序在结束时全部释放,这为我们编程人员省去了不少麻烦,我们可以连想都不想怎么去管理内存,反正.NET自己会保证一切。好吧,有道理,有一定的道理。问题是,当我们用到非托管资源时.NET就不能自动管理了。这是因为非托管代码不受CLR(Common Language Runtime)控制,超出CLR的管理范围。那么如何处理这些非托管资源呢,.

为者常成,行者常至 1万+

C#通过PInvoke调用c++函数的备忘录

目前知道的情况被调用的C/C++函数只能是全局函数 不能调用类中的成员方法 被调用的C函数必须使用extern “C“包含,保证采用的导出函数名生成规则和.NET一致 函数调用约定通常使用WINAPI也就是__stdcall,.net默认也是__stdcall .net可以和c++同时用cdecl调用约定,这样可以支持可变参数个数 c函数必须使用__declspec(dllexp...

数语轩 339

.net托管代码和非托管代码

.NET Framework 提升与COM组件、COM+服务、外部类型库和许多操作系统服务进行交互。托管和非托管对象模型之间的数据类型、方法签名和错误处理机制有所不同。 要简化.NET Framework组件和非托管代码之间的互操作并简化迁移路径,公共语言运行时(CLR)需对客户端和服务端隐藏这些对象模型中的差异。 1.什么是托管代码? 在运行时(CLR)控制下执行的代码称为托管代...

weixin_30607029的博客 291

【FCL】托管与非托管

托管与非托管是用来修饰内存的。

ZAIJIANLUOYE110的专栏 950
上一篇: 王莽:世界上第一个征收所得税的人
下一篇: 做数学找好工作--美国工作排行榜 数学家位居首位
Suprman
博客等级 码龄25年 858粉丝 144原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值