zoukankan      html  css  js  c++  java
  • C# StructLayout(LayoutKind.Sequential)]

     
    结构体是由若干成员组成的.布局有两种
    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 );

  • 相关阅读:
    C++中几个值得分析的小问题(1)
    《Effective C++》第5章 实现-读书笔记
    《Effective C++》第4章 设计与声明(2)-读书笔记
    《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记
    《Effective C++》第4章 设计与声明(1)-读书笔记
    《Effective C++》第3章 资源管理(2)-读书笔记
    【剑指Offer】24二叉树中和为某一值的路径
    【剑指Offer】23二叉搜索树的后序遍历序列
    【剑指Offer】22从上往下打印二叉树
    【剑指Offer】21栈的压入、弹出序列
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/5577148.html
Copyright © 2011-2022 走看看