首页 > 解决方案 > C# 结构的实际情况是什么?

问题描述

所以这是一个非常简单的问题

[StructLayout(LayoutKind.Sequential)]
public struct test
{
    public uint a;
}

^ 这编组为 4

[StructLayout(LayoutKind.Sequential)]
public struct test
{
    public IntPtr b;
}

^ 这编组为 8

[StructLayout(LayoutKind.Sequential)]
public struct test
{
    public uint a;
    public IntPtr b;
}

^ 这编组到 16 的大小

现在我不确定我的计算器是坏了还是什么,但我很确定 8+4 不是 16 ......有什么理由发生这种废话吗?

我需要它来生成正确的大小以用于 Windows API 调用

好吧,我正在尝试调用“NtQueryInformationThread”,但我的结构无效,因为这是结构:

    [StructLayout(LayoutKind.Sequential)]
    public struct TbiClientId
    {
        public IntPtr UniqueProcess;
        public IntPtr UniqueThread;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct ThreadBasicInformation
    {
        public uint ExitStatus;
        public IntPtr TebBaseAdress;
        public int ProcessId;
        public TbiClientId ClientId;
        public UIntPtr AffinityMask;
        public uint Priority;
        public uint BasePriority;
    }

在 marshal.sizeof 下,它显示为 56,但如果我将 48 传递给 API,API 仅接受 48,它返回成功并填充结构....

标签: c#

解决方案


Auint是 32 位类型。AnIntPtr依赖于平台,在 64 位平台上将是 64 位的。

对于第三个示例,结构成员与某些边界对齐,以提高内存访问效率,在本例中似乎位于 8 字节边界上。您可以使用属性对其Pack进行修改。

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct test
{
    public uint a;
    public IntPtr b;
}

推荐阅读