Marshal.SizeOf(结构类型) 总是抛出错误

本文关键字:出错 错误 SizeOf 结构 类型 Marshal | 更新日期: 2023-09-27 18:34:50

以下是我的代码片段

class Program
{
    static void Main(string[] args)
    {
        Program.GetState(new State() { enabled = true, currentLimit = 30 });
    }
    private static void GetState(State result)
    {
        IntPtr Ptr = Marshal.AllocHGlobal(Marshal.SizeOf(result));
        Marshal.StructureToPtr(result, Ptr, false);
    }
}
[StructLayout(LayoutKind.Sequential)]
public struct State
{
    [MarshalAsAttribute(UnmanagedType.I8)]
    public uint currentLimit;
    [MarshalAsAttribute(UnmanagedType.I1)]
    public bool enabled;
}

它总是抛出一个错误,即

类型"MarshellingStructureSize.State"不能封送为 非托管结构;无法计算有意义的大小或偏移量。

我的目的是通过 pInvoke 为本机 DLL 发送一个结构,但是当我尝试通过 Marshal 在托管代码中为我的结构分配内存时,它总是抛出上述错误。

任何帮助将不胜感激。

Marshal.SizeOf(结构类型) 总是抛出错误

uint实际上是占用内存4个字节的System.UInt32的别名。我认为currentLimit无法在内存中转换为 8 个字节,这就是您出现错误的原因。

[MarshalAsAttribute(UnmanagedType.I8)]
public uint currentLimit;

I8 适用于有符号 8 字节整数。 尝试将其更改为 U4I4

[MarshalAsAttribute(UnmanagedType.U4)]
public uint currentLimit;

或者按照 Passant 的建议将currentLimit类型更改为ulong@Hans。

[MarshalAsAttribute(UnmanagedType.I8)] //or U8 
public ulong currentLimit;

这行得通。

相关文章: