MarshalAs:指示如何在托管代码和非托管代码之间封送数据。
简单点说,托管代码是一Microsoft的中间语言,它主要的作用是在.NET Farmework的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:
1.源代码编译为托管代码;(所以源代码可以有很多种,如VB,C#,J#)
2.托管代码编译为Microsoft系统的.net平台专用文件(如类库、可执行文件等)。
如下所示,设置一个固定大小为3的无符号数组
public struct tagStatisticsRGB
{
//MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。
// 当 MarshalAsAttribute.Value 设置为 ByValArray 时,
// 必须设置 SizeConst 以指示数组中的元素数。当需要区分字符串类型时,
// ArraySubType 字段可以选择包含数组元素的 UnmanagedType。
// 此 UnmanagedType 只可用于作为结构中的字段的数组。
// SizeConst = 2表示数组长度为2
// ArraySubType = UnmanagedType.Struct 表示这个数组是Struct结构体数组
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.U4)]
public uint[] RGB3;
}
当 MarshalAsAttribute.Value 设置为 ByValArray 时,必须设置 SizeConst 以指示数组中的元素数。当需要区分字符串类型时,ArraySubType 字段可以选择包含数组元素的 UnmanagedType
参考:
https://blog.csdn.net/zibinghanmo/article/details/40655381
https://blog.csdn.net/yulongguiziyao/article/details/11874427