[转]StructLayout特性

摘要:
其构造函数使用LayoutKind值初始化StructLayoutAttribute类的新实例。布局类型。“顺序”用于强制构件按其出现的顺序顺序排列。StructureLayout特性允许我们控制Structure语句块的元素在内存中的排列方式,以及当这些元素传递到外部DLL时,运行时如何排列这些元素。此设置可以在VB.NET中更改,并且可以通过System.Runtime访问。InteropServices StructLayout功能精确控制每个结构构件的位置。[StructLayout]publicstructLIST_OPEN{publicintdwServerId;publicintdwListId;publicSystem.UInt16wRecordSize;publicSystem.UI nt16wDummy;publicintdwFileSize;publicintdTotalRecs;publicNS_PREFETCHLISTPrefetch;[MarshalAs]publicstringszSrcMach;[MarsharAs]publicstring zSrcComp;}本例中使用MashalAs特性来描述字段、方法或参数的封送处理格式。

转自:http://www.cnblogs.com/JessieDong/archive/2009/07/21/1527553.html

StructLayout特性

StructLayout特性     
     公共语言运行库利用StructLayoutAttribute控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。它的构造函数中用 LayoutKind值初始化 StructLayoutAttribute 类的新实例。 LayoutKind.Sequential 用于强制将成员按其出现的顺序进行顺序布局。
  StructLayout特性允许我们控制Structure语句块的元素在内存中的排列方式,以及当这些元素被传递给外部DLL时,运行库排列这些元素的方式。Visual   Basic结构的成员在内存中的顺序是按照它们出现在源代码中的顺序排列的,尽管编译器可以自由的插入填充字节来安排这些成员,以便使得16位数值用子边界对齐,32位数值用双字边界对齐。    
  使用这种排列(未压缩布局)提供的性能最佳。     
  在Visual   Basic   6的用户自定义结构是未压缩的,而且我们不可以改变这一默认设置。在VB.NET中可以改变这种设置,并且可以通过System.Runtime.InteropServices.StructLayout   特性精确的控制每一个结构成员的位置。
System.Runtime.InteropServices.StructLayout   允许的值有StructLayout.Auto   StructLayout.Sequential   StructLayout.Explicit.
1.Sequential,顺序布局,比如
struct S1
{
  int a;
  int b;
}
那么默认情况下在内存里是先排a,再排b
也就是如果能取到a的地址,和b的地址,则相差一个int类型的长度,4字节
[StructLayout(LayoutKind.Sequential)]
struct S1
{
  int a;
  int b;
}
这样和上一个是一样的.因为默认的内存排列就是Sequential,也就是按成员的先后顺序排列.
2.Explicit,精确布局
需要用FieldOffset()设置每个成员的位置
这样就可以实现类似c的公用体的功能
[StructLayout(LayoutKind.Explicit)]
struct S1
{
  [FieldOffset(0)]
  int a;
  [FieldOffset(0)]
  int b;
}
这样a和b在内存中地址相同 
StructLayout特性支持三种附加字段:CharSet、Pack、Size。
·   CharSet定义在结构中的字符串成员在结构被传给DLL时的排列方式。可以是Unicode、Ansi或Auto。     
  默认为Auto,在WIN   NT/2000/XP中表示字符串按照Unicode字符串进行排列,在WIN   95/98/Me中则表示按照ANSI字符串进行排列。     
·   Pack定义了结构的封装大小。可以是1、2、4、8、16、32、64、128或特殊值0。特殊值0表示当前操作平台默认的压缩大小。     

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct LIST_OPEN
    {
        public int dwServerId;
        public int dwListId;
        public System.UInt16 wRecordSize;
        public System.UInt16 wDummy;
        public int dwFileSize;
        public int dwTotalRecs;
        public NS_PREFETCHLIST sPrefetch;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)]
        public string szSrcMach;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)]
        public string szSrcComp;
    }

此例中用到MashalAs特性,它用于描述字段、方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。
例如,以下代码将两个参数作为数据类型长指针封送给 Windows API 函数的字符串 (LPStr): 
[MarshalAs(UnmanagedType.LPStr)] 
String existingfile; 
[MarshalAs(UnmanagedType.LPStr)] 
String newfile; 
注意结构作为参数时候,一般前面要加上ref修饰符,否则会出现错误:对象的引用没有指定对象的实例。
[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]
public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );

免责声明:文章转载自《[转]StructLayout特性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇gulp配置,实例演示primary库新增数据文件后,standby库无法创建文件并终止数据同步下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

51nod 1136 欧拉函数【数论】

1136 欧拉函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1...

sscanf函数用法详解

名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 … ); int scanf( const char *format [,argument]… ); 说明: sscanf与scanf类似,都是用于输入的,...

linux C++ 共享库导出类

1.共享库的对外接口函数的声明必须加上extern “C”。 2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。 以下是一个插件式设计的示例: 1、主执行程序:main.cpp #include #include #include "SMSGamePlugin.h" int...

PHP图像处理(GD库)

一、图像处理概述 1、开启GD2图像扩展库 ①PHP不仅限于只产生HTML的输出,还可以创建与操作多种不同格式的图像文件。PHP提供了一些内置的图像处理函数,也可以使用GD函数库创建新图像或处理已有的图像。目前GD2库支持JPEG、PNG和WBMP格式。 ②GD扩展用于动态创建图片,使用C语言编写,开放源代码,现在的版本是2.0,所以称为GD2。 ③开...

算法训练 安慰奶牛

算法训练 安慰奶牛 时间限制:1.0s 内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到N。每一个牧场都是一个奶牛的家。FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。你首先要决定那些道路是需要保留的N-1条道路。第j条双向...

SQL GUID和自增列做主键的优缺点

我们公司的数据库全部是使用GUID做主键的,很多人习惯使用int做主键。所以呢,这里总结一下,将两种数据类型做主键进行一个比较。 使用INT做主键的优点:     1、需要很小的数据存储空间,仅仅需要4 byte 。     2、insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。     3、index和J...