MarshalAs的数组的SizeConst有什么作用

这篇文章主要介绍“MarshalAs的数组的SizeConst有什么作用”,在日常操作中,相信很多人在MarshalAs的数组的SizeConst有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MarshalAs的数组的SizeConst有什么作用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联公司是一家从事企业网站建设、成都网站建设、做网站、行业门户网站建设、网页设计制作的专业网站设计公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点超过千家。

[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;
        }
 Console.WriteLine("Number of bytes needed by a CLS object:{0}", Marshal.SizeOf(typeof(CLS)));
CLS cls = new CLS();
            string[] s = new string[10];
            for (int i = 0; i < 10;i++ )
            {
                s[i] = "demo" + i;
            }
            cls.msgs = s;
            for(int i=0;i

上面程序能正确执行显示:demo0....demo9。两次console.writeline大小值一样112。很不明白的地方就是:

CLS中的msgs已经定义了SizeConst=5,即数量为5个元素的数组大小,而实际代码中string[] s的大小是10个串,也就是说cls.msgs的大小也是10个字符串数组,这不冲突有问题吗???两次writeline数据一样,是不是说明实际在计算大小的时候,这个msgs的真正空间大小并没有计算在内,只计算了SizeConst*一个指向真正地址空间的指针的大小即一般来说指针大小是4个字节(本猜想可以参考https://my.oschina.net/u/2963604/blog/5013061这个实验中的“ 说明:CLS中没有msg和msgs时是88,有msg是92,有msgs是112。 ”来验证)。如果这个猜想是正确的,那我就不明白了,SizeConst=5有什么用呢?反正这个msgs是一个数组,只要知道类型是UnmanagedType.ByValArray,ArraySubType=UnmanagedType.LPSTR/LPWSTR等就可以了,没有必要知道SizeConst。不知有没有人能说得清楚。

到此,关于“MarshalAs的数组的SizeConst有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


分享题目:MarshalAs的数组的SizeConst有什么作用
标题URL:http://myzitong.com/article/isjdie.html

其他资讯