.NET 中 PInvoke 与 COM Interop 深入解析
1. 数组与内存管理基础
在.NET 开发中,数组作为引用类型是可以被固定的。如果数组元素是可封送的,并且通过 PInvoke 或 COM Interop 调用与调用方处于同一“单元”的活动对象时,可以固定数组。当数组作为结构的一部分定义时,通常会像处理其他对象一样处理它,但可以通过 MarshalAs 属性按值传递,示例代码如下:
<StructLayout(LayoutKind.Sequential)> Structure MyStruct
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _
Public s1() As Short
End Structure
上述代码中,如果按值在栈上传递该结构,由于 MarshalAs 属性指定数组 s1 有 64 个元素,所以该结构占用 128 字节。若没有此属性,数组将像其他对象引用一样被封送,结构仅占用 4 字节。
2. Marshal 类的使用
Marshal 类是手动封送的基础,它包含一系列静态方法,可处理几乎所有与非托管内存相关的操作。以下是 Marshal 类的一些常用方法:
- SizeOf 方法 :用于获取对象或结构在非托管代码中封送时应占用的字节数
超级会员免费看
订阅专栏 解锁全文
30

被折叠的 条评论
为什么被折叠?



