C# MarshalAs

 

作用:

MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。

使用方法:

[MarshalAs(UnmanagedType unmanagedType, 命名参数)]

实际上相当于构造一个MarshalAsAttribute类的对象

常用的UnmanagedType枚举值:(详细内容查MSDN)

BStr   长度前缀为双字节的 Unicode 字符串;

LPStr  单字节、空终止的 ANSI 字符串。;

LPWStr  一个 2 字节、空终止的 Unicode 字符串;

ByValArray 用于在结构中出现的内联定长字符数组,应始终使用MarshalAsAttribute的SizeConst字段来指示数组的大小。

注意:

在用Marshal.SizeOf(),即获取对象的非托管大小时,获得的是自己定义的大小;

但在实际处理的时候,是按照实际的大小来获取的

示例:

定义一个固定大小的结构体,代码如下:

结构的声明:

  

  1. struct Info  
  2. {  
  3.     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]  
  4.     public char[] name;  
  5.     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]  
  6.     public char[] cipher;  
  7.     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]  
  8.     public char[] signature;  
  9. }  

结构的使用:

 

  1. Info myInfo;  
  2. myInfo.name = name.ToCharArray();  
  3. myInfo.cipher = cipher.ToCharArray();  
  4. myInfo.signature = signature.ToCharArray();  

注意:

 

  1. int size = Marshal.SizeOf(myInfo);  

size=16+16+256

 

可见,获取到的非托管大小为288

 

posted @   SusieSnail_SUN  阅读(3679)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示