C#为什么sizeof是不安全的,如何以安全的方式获取结构的大小?

C#为什么sizeof是不安全的,如何以安全的方式获取结构的大小?,c#,C#,我已经定义了一个通过套接字发送的结构。我想知道它的大小,但是sizeof是不安全的,对于“System.Runtime.InteropServices.MarshalSizeOf”也是如此。有没有办法以安全的方式获取其大小?对于托管结构,没有办法这样做Marshal.SizeOf将只返回组成结构的封送类型上的数据大小。。。对于某些平台上的托管类型,这可能是正确的,但在其他平台上则不正确 这是通过设计实现的,因此JIT可以根据其运行的平台以不同的方式放置结构 此处的更多信息:请参阅以获取包装器库,

我已经定义了一个通过套接字发送的结构。我想知道它的大小,但是
sizeof
是不安全的,对于“
System.Runtime.InteropServices.MarshalSizeOf
”也是如此。有没有办法以安全的方式获取其大小?

对于托管结构,没有办法这样做
Marshal.SizeOf
将只返回组成结构的封送类型上的数据大小。。。对于某些平台上的托管类型,这可能是正确的,但在其他平台上则不正确

这是通过设计实现的,因此JIT可以根据其运行的平台以不同的方式放置结构

此处的更多信息:

请参阅以获取包装器库,该库允许您确定JIT将定义托管类型的大小(在运行时)。它的工作原理是使用
sizeof
IL指令,该指令在C#中根本没有公开。它可以在没有任何特殊权限的情况下运行,并且是可验证的


注意:这可能不是你真正想要的。对于实际上只有一个字节的结构,这可能返回
8
。我真的不完全理解你的问题,所以我不确定这是否真的是你想要的

定义安全<就CLR而言,code>Marshal.SizeOf是完全安全的。Noldorin-Marshal.SizeOf需要设置不安全的代码权限才能执行。这是OP的问题:System.Runtime.InteropServices.MarshalSizeOf(typeof(MyStruct))和任何地方都没有“不安全”,并且还取消选中了“允许不安全代码”复选框。现在对我来说没问题了??????如果您通过套接字发送数据,那么假设发送方和接收方共享相同的平台,因此大小相同是不安全的。更安全的做法是先序列化并发送大小,然后发送序列化结果。
Marshal.SizeOf
如果结构是泛型类型,则会失败。有关信息和解决问题的方法,请参见。重要的问题是,为什么需要知道结构的大小?很可能是因为不安全的原因(在这种情况下,您可以使用
sizeof
)或是P/Invoke(在这种情况下,
Marshal.sizeof
是正确的答案)。同意。我只是想回答最初的问题:“为什么sizeof不安全,以及如何以安全的方式获取结构的大小?”:-)一个原因是:您想创建一个包含许多结构的数组,并且需要知道有多少结构适合2GB。您需要知道运行时将为结构分配多少内存。