Marshal 类的内存操作的一般功能

Marshal类在.NET中提供了一组方法,用于处理非托管内存,包括分配内存、复制内存块、转换托管类型到非托管类型等。这些方法主要用于与非托管代码交互,特别是对于需要在托管和非托管编程模型之间建立桥梁的开发者。文章介绍了如StringToHGlobalAnsi、StructureToPtr和PtrToStructure等关键方法的使用,并展示了如何进行内存操作,包括写入和读取数据、字符串转换以及处理内存分配和释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Marshal类

提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。

命名空间:System.Runtime.InteropServices

 

Marshal 类中定义的 static 方法对于处理非托管代码至关重要。此类中定义的大多数方法通常由需要在托管和非托管编程模型之间提供桥梁的开发人员使用。

例如,StringToHGlobalAnsi 方法将 ANSI 字符从指定的字符串(在托管堆中)复制到非托管堆中的缓冲区。该方法还分配大小正确的目标堆。

 

  公共方法

<

方法名称

说明

AddRef  

递增指定接口上的引用计数。

AllocCoTaskMem  

从 COM 任务内存分配器分配指定大小的内存块。

AllocHGlobal  

使用 LocalAlloc 分配内存块。

BindToMoniker  

获取由指定的名字对象标识的接口指针。

ChangeWrapperHandleStrength  

在 COM 可调用包装 (CCW) 句柄包含的对象上更改它的强度。

Copy  

将数据从托管数组复制到非托管内存指针,或从非托管内存指针复制到托管数组。

CreateAggregatedObject  

聚合托管对象和指定的   COM 对象。

CreateWrapperOfType  

在指定类型的对象中包装指定的 COM 对象。

DestroyStructure  

释放指定的非托管内存块所指向的所有子结构。

Equals   

。 确定两个   Object   实例是否相等。 (从 Object   继承。)

FinalReleaseComObject  

通过将提供的运行库可调用包装 (RCW) 的引用计数设置为 0,释放对 RCW 的所有引用。

FreeBSTR  

使用   SysFreeString 释放 BSTR。

FreeCoTaskMem  

释放由非托管 COM 任务内存分配器使用 Marshal.AllocCoTaskMem   分配的内存块。

FreeHGlobal  

释放以前使用 AllocHGlobal   从进程的非托管内存中分配的内存。

GenerateGuidForType  

返回指定类型的全局唯一标识符 (GUID),或使用类型库导出程序 (TlbExp.exe) 所用的算法生成 GUID。

GenerateProgIdForType  

返回指定类型的编程标识符   (ProgID)。

GetActiveObject  

从运行对象表 (ROT)   获取指定对象的运行实例。  

GetComInterfaceForObject  

返回一个接口指针,该接口指针表示对象的指定接口。

GetComInterfaceForObjectInContext  

返回一个接口指针,该指针表示对象的指定接口(如果调用方与对象在同一上下文中)。

GetComObjectData  

从指定的 COM 对象获取指定键所引用的数据。

GetComSlotForMethodInfo  

获取指定的 System.Reflection.MemberInfo   在向 COM 公开时的虚函数表 (VTBL) 槽。

GetDelegateForFunctionPointer  

将非托管函数指针转换为委托。

GetEndComSlot  

获取在向 COM 公开时某个类型的虚函数表 (VTBL) 中的最后一个槽。

GetExceptionCode  

检索标识所发生异常的类型的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值