gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:07:40 35 4
gpt4 key购买 nike

以下是我的代码片段

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;
}

它总是抛出一个错误,即

Type 'MarshellingStructureSize.State' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.

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

如有任何帮助,我们将不胜感激。

最佳答案

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

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

I8 是有符号的 8 字节整数。尝试将其更改为 U4I4

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

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

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

这有效。

关于c# - Marshal.SizeOf(strurtureType) 总是抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19317529/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com