• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            StructLayout特性

            StructLayout特性

                 公共語言運行庫利用StructLayoutAttribute控制類或結構的數據字段在托管內存中的物理布局,即類或結構需要按某種方式排列。如果要將類傳遞給需要指定布局的非托管代碼,則顯式控制類布局是重要的。它的構造函數中用 LayoutKind值初始化 StructLayoutAttribute 類的新實例。 LayoutKind.Sequential 用于強制將成員按其出現的順序進行順序布局。
             
              StructLayout特性允許我們控制Structure語句塊的元素在內存中的排列方式,以及當這些元素被傳遞給外部DLL時,運行庫排列這些元素的方式。Visual   Basic結構的成員在內存中的順序是按照它們出現在源代碼中的順序排列的,盡管編譯器可以自由的插入填充字節來安排這些成員,以便使得16位數值用子邊界對齊,32位數值用雙字邊界對齊。     
                
              使用這種排列(未壓縮布局)提供的性能最佳。     
                    
            通過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的公用體(union)的功能
            [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 );


            string result;
            IntPtr strPtr = new IntPtr() ;// unmanaged api TestStringAsResultIntPrt(1);
            result = Marshal.PtrToStringUni(strPtr);
            result = Marshal.PtrToStringAnsi(strPtr);
            Marshal.FreeCoTaskMem(strPtr);

            posted on 2015-12-21 16:27 天下 閱讀(513) 評論(0)  編輯 收藏 引用 所屬分類: C#

            <2016年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            精品欧美一区二区三区久久久 | 亚洲中文久久精品无码ww16| 久久中文精品无码中文字幕| 99精品国产免费久久久久久下载 | 成人资源影音先锋久久资源网| 国产精品99久久不卡| 一个色综合久久| 91精品国产色综合久久| 深夜久久AAAAA级毛片免费看 | 国产综合成人久久大片91| 久久99久久成人免费播放| 色欲久久久天天天综合网精品| 精品无码久久久久久久动漫| 久久久久久伊人高潮影院| 99久久99久久精品国产片果冻| 久久久久久精品免费看SSS| 中文字幕亚洲综合久久2| 久久99热这里只有精品66| 9191精品国产免费久久| 亚洲狠狠婷婷综合久久久久| 久久人人爽人人精品视频| 精品午夜久久福利大片| 午夜精品久久久久久久久| 日韩欧美亚洲国产精品字幕久久久| 精品久久久久久国产| 人妻精品久久无码区| 97久久婷婷五月综合色d啪蜜芽| 久久99久久成人免费播放| 国产三级久久久精品麻豆三级 | 久久久久亚洲AV无码永不| 波多野结衣久久一区二区| 久久夜色撩人精品国产小说| 国产福利电影一区二区三区久久久久成人精品综合 | 久久亚洲AV成人出白浆无码国产| 欧美久久天天综合香蕉伊| 青青草国产精品久久| 久久99国产精品二区不卡| 狠色狠色狠狠色综合久久| 国产精品欧美久久久天天影视| 久久精品国产亚洲AV香蕉| 无码AV波多野结衣久久|