Marshal.SizeOf(strurtureType)总是抛出错误

时间:2013-10-11 11:54:45

标签: c# c++ .net pinvoke

以下是我的代码段

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为托管代码中的结构分配内存时,它总是抛出错误。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

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

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

I8用于签名的8字节整数。尝试将其更改为U4I4

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

或者将currentLimit的类型更改为ulong,如@Hans Passant建议的那样。

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

这有效。