c# - 检索结构体的 [StructLayout] 属性

标签 c# struct sizeof

我想从应用于以下结构的 StructLayout 中获取 22 字节的结构大小。

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi, Pack = 1, Size = 22)]
internal unsafe struct Entry
{
    [FieldOffset(0)]
    private fixed char title[14];
    [FieldOffset(14)]
    private readonly int size;
    [FieldOffset(18)]
    private readonly int start;
}

有人会建议 Marshal.SizeOf,但它返回 28 字节的非托管对象的大小,这是不希望的。

int count = Marshal.SizeOf(typeof(Entry));

但是,获取此属性似乎是不可能的,因为数组“customAttributes”的长度始终为 0。

var type = typeof(Entry);
var customAttributes = type.GetCustomAttributes(typeof(StructLayoutAttribute), true);

有什么解决办法吗?

最佳答案

StructLayout 属性中的信息作为 IL 指令(而不是自定义属性)嵌入到方法中。要检索它,您可以使用 Type.StructLayoutAttribute Property :

var type = typeof(Entry);
var sla = type.StructLayoutAttribute;

或者,如果该结构在您的控制之下,您可以简单地定义一个 Size 常量:

[StructLayout(LayoutKind.Explicit, Pack = 1, Size = Entry.Size)]
internal unsafe struct Entry
{
    public const int Size = 22;
    ...

关于c# - 检索结构体的 [StructLayout] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17684664/

相关文章:

c - 将结构指针对象/变量声明为 extern

c - 从传递给函数的嵌套结构访问信息

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

c# - 调整大小和存储图像但锁定以确保它只完成一次

c# - 要解密的数据长度无效

c# - System.Web.Script.Serialization.JavaScriptSerializer 还是 System.Runtime.Serialization.Json.DataContractJsonSerializer?

c++ - sizeof(*this) 和结构继承

c# - 如何快速检查警报是否存在?

c - "hashLink"之前的预期表达式

c++ - 在作为参数传递的数组上使用 sizeof