zoukankan      html  css  js  c++  java
  • 用StructLayout特性限定声明结构或类http://blog.csdn.net/Ador3/archive/2008/07/23/2694967.aspx

    用StructLayout特性限定声明结构或类
      公共语言运行库利用StructLayoutAttribute控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。它的构造函数中用 LayoutKind值初始化 StructLayoutAttribute 类的新实例。 LayoutKind.Sequential 用于强制将成员按其出现的顺序进行顺序布局。
      LayoutKind.Explicit 用于控制每个数据成员的精确位置。利用 Explicit, 每个成员必须使用 FieldOffsetAttribute 指示此字段在类型中的位置。如:

    [StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
    public class MySystemTime
    {
    [FieldOffset(0)]public ushort wYear;
    [FieldOffset(2)]public ushort wMonth;
    [FieldOffset(4)]public ushort wDayOfWeek;
    [FieldOffset(6)]public ushort wDay;
    [FieldOffset(8)]public ushort wHour;
    [FieldOffset(10)]public ushort wMinute;
    [FieldOffset(12)]public ushort wSecond;
    [FieldOffset(14)]public ushort wMilliseconds;
    }
      下面是针对API中OSVERSIONINFO结构,在.net中定义对应类或结构的例子:
    /**********************************************
    * API中定义原结构声明
    * OSVERSIONINFOA STRUCT
    * dwOSVersionInfoSize DWORD ?
    * dwMajorVersion DWORD ?
    * dwMinorVersion DWORD ?
    * dwBuildNumber DWORD ?
    * dwPlatformId DWORD ?
    * szCSDVersion BYTE 128 dup (?)
    * OSVERSIONINFOA ENDS
    *
    * OSVERSIONINFO equ <OSVERSIONINFOA>
    *********************************************/
    //.net中声明为类

    [ StructLayout( LayoutKind.Sequential )]
    public class OSVersionInfo
    {
    public int OSVersionInfoSize;
    public int majorVersion;
    public int minorVersion;
    public int buildNumber;
    public int platformId;
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
    public String versionString;
    }
    //或者
    //.net中声明为结构

    [ StructLayout( LayoutKind.Sequential )]
    public struct OSVersionInfo2
    {
    public int OSVersionInfoSize;
    public int majorVersion;
    public int minorVersion;
    public int buildNumber;
    public int platformId;
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
    public String versionString;
    }
      此例中用到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 );

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Ador3/archive/2008/07/23/2694967.aspx

  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/si812cn/p/1574396.html
Copyright © 2011-2022 走看看