SizeOf与Structure与Managed Code

中午刚刚提交给MS一个case,问题描述如下:
(这是一个开源的EXCEL的代码,原来是用vb.net写的,我用C#改写了一遍。vb.net中使用的API:FilePut是没有这个问题的,我自己写的这个,就是不行。)

下面的Marshal.SizeOf(vt)这行代码中,对于我下面给出的例子里面,我希望的size应该是2+2+1,而不是内存对齐后的6。我如何得到5这个值?

 private void FilePut(System.ValueType vt)

{            

         int size = 0;

         size = Marshal.SizeOf(vt);

         IntPtr p = Marshal.AllocHGlobal(size);

         Marshal.StructureToPtr(vt,p,true);

         byte[] buf = new byte[size];

         Marshal.Copy(p,buf,0,size);

fs.Write(buf,0,buf.Length);

}

 

//调用的代码:

l = aFormat[lIndex].Length;

cFORMAT_RECORD.opcode = 0x1e;

cFORMAT_RECORD.length = (short)(l+1);

cFORMAT_RECORD.FormatLength = (byte)(l);

FilePut(cFORMAT_RECORD);

 

// 结构示例

[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Auto)]

struct FORMAT_RECORD

{

     public short opcode;// 0x1e

     public short length;//1+len(format)

     [MarshalAs(UnmanagedType.U1, SizeConst=1)]public byte FormatLength;//len(format)

}//followed by the Format-Picture

等MS给我回复后,我把结果post上来分享给大家。

posted @   鞠强  阅读(2342)  评论(6编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

hello

world

点击右上角即可分享
微信分享提示