StructLayout的特性
目录
1、博客介绍
在写前一篇关于调用win32的API来获取windows窗口的时候,看到了一些StructLayout的的写法,初始有些不是很理解该写法的含义,略查了一下,本篇博客做知识记录。
2、内容
(1)写法用例
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
public class StringClass
{
[FieldOffset(0)] public string str1;
[FieldOffset(1)] public string str2;
[FieldOffset(2)] public string str3;
[FieldOffset(3)] public string str4;
[FieldOffset(4)] public string str5;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class FileDlg
{
public int structSize = 0;
public IntPtr dlgOwner = IntPtr.Zero;
public IntPtr instance = IntPtr.Zero;
public String filter = null;
}
(2)作用
StructLayout可以确保传入的结构的布局与目标调用代码要求的布局一致
参数:LayoutKind
该参数有两个属性Sequential和Explicit,Sequential参数可以确保修饰的方法或结构体内的属性,按照顺序来传入调用,Explicit可以通过[FieldOffset(0)]的方式精确的定位属性的顺序标记。
参数:CharSet = CharSet.Auto
编码格式
(3)使用场景
默认情况下,.net会对托管对象的布局进行调整,因为调整可以节省内存。但是有时候,我们不希望这种自动调整,原因是,我们在调用win32api时,原api属于非托管代码,这些代码中的相应的结构中的布局是一定的,我们传入的参数必须符合原始布局,此时我们就可以使用StructLayout来确保传入的结构的布局和目标调用代码要求的布局一致,
3、推送
Github:https://github.com/KingSun5
4、结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
QQ交流群:806091680(Chinar)
该群为CSDN博主Chinar所创,推荐一下!我也在群里!