溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Marshal.SizeOf是如何計(jì)算大小的

發(fā)布時(shí)間:2021-10-13 15:01:49 來源:億速云 閱讀:246 作者:iii 欄目:編程語言

這篇文章主要講解了“Marshal.SizeOf是如何計(jì)算大小的”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Marshal.SizeOf是如何計(jì)算大小的”吧!

今天發(fā)現(xiàn)一個(gè)C#的怪現(xiàn)象:
string[] msgs = { "zs", "li", "wu" };
int sizeoflen = Marshal.SizeOf(msgs);
IntPtr pmsgs = Marshal.AllocHGlobal(sizeoflen);
結(jié)果發(fā)現(xiàn)Marshal.SizeOf(msgs)這一句出現(xiàn):ArgumentException類型的未經(jīng)處理的異常在mscorlib.dll中發(fā)生,其它信息:String[]不能作為非托管結(jié)構(gòu)進(jìn)行封送處理:無法計(jì)算有意義的大小或偏移量。如何換成int sizeoflen = Marshal.SizeOf(msgs[0]);也是異常:String不能作為非托管結(jié)構(gòu)進(jìn)行封送處理:無法計(jì)算有意義的大小或偏移量。
但是如果有:
[StructLayout(LayoutKind.Sequential)]
        class CLS
        {
            public int id;
            public float value;
            [MarshalAs(UnmanagedType.ByValArray,SizeConst=10,ArraySubType=UnmanagedType.Struct)]
            public Point[] ps;
            [MarshalAs(UnmanagedType.LPStr)]
            public string msg;
            [MarshalAs(UnmanagedType.ByValArray,SizeConst=5,ArraySubType=UnmanagedType.LPStr)]
            public string[] msgs;
        }
CLS[] clss = new CLS[2];
int clsslen = Marshal.SizeOf(clss);
也是出現(xiàn)類似上面的CLS[]異常;修改為
int clsslen = Marshal.SizeOf(clss[0]);則出現(xiàn):AugumentNullException類型的未經(jīng)處理的異常:值不能為null。再次修改為 
clss[0] = new CLS();
clss[1] = new CLS();
int clsslen = Marshal.SizeOf(clss);還是出現(xiàn):CLS[]異常;再修改為針對(duì)一個(gè)成員對(duì)象:
int clsslen = Marshal.SizeOf(clss[0]);則成功出現(xiàn)值大小。
這說明要想計(jì)算CLS[] clss的真正大小,可以用一個(gè)成員的大小再乘以元素?cái)?shù)量。
回到最開始的string[] msgs = { "zs", "li", "wu" };上來說,最終實(shí)驗(yàn)發(fā)現(xiàn)不管是用Marshal.SizeOf(msgs)還是用Marshal.SizeOf(msgs[0])都是無法計(jì)算大小的異常。由此可以總結(jié)出來:
string或string[]要想計(jì)算大小,是不可能通過Marshal.SizeOf來得到結(jié)果的。
其它的包括struct值類型(struct需要StructLayout屬性進(jìn)行限定)在內(nèi)是可以通過Marshal.SizeOf獲得大小的,基礎(chǔ)值類型可以用sizeof獲得;引用類型則可以通過Marshal.SizeOf獲得,但數(shù)組不能直接獲得,需要先初始化數(shù)組的成員,然后Marshal.SizeOf(一個(gè)成員對(duì)象變量)的結(jié)果再乘以數(shù)組長(zhǎng)度就是總內(nèi)存大小。

感謝各位的閱讀,以上就是“Marshal.SizeOf是如何計(jì)算大小的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Marshal.SizeOf是如何計(jì)算大小的這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI