Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取给定System.Type的结构的大小_C#_.net_Sizeof - Fatal编程技术网

C# 获取给定System.Type的结构的大小

C# 获取给定System.Type的结构的大小,c#,.net,sizeof,C#,.net,Sizeof,给定一个结构MyStruct,我可以在不安全代码中使用sizeof(MyStruct)来获取该结构实例的大小。但是,我希望在给定结构的Type对象的情况下获得结构的大小,即sizeof(typeof(MyStruct))。有Marshal.SizeOf,但它返回非托管封送大小,而我需要该结构的托管大小。没有文档化的方法来发现托管结构的布局。JIT编译器很容易利用这一点,它将对结构的字段重新排序以获得最佳打包。按照[StructLayout]属性的指示,始终需要封送才能获得可预测的布局。您必须跳过

给定一个结构
MyStruct
,我可以在不安全代码中使用
sizeof(MyStruct)
来获取该结构实例的大小。但是,我希望在给定结构的
Type
对象的情况下获得结构的大小,即
sizeof(typeof(MyStruct))
。有
Marshal.SizeOf
,但它返回非托管封送大小,而我需要该结构的托管大小。

没有文档化的方法来发现托管结构的布局。JIT编译器很容易利用这一点,它将对结构的字段重新排序以获得最佳打包。按照
[StructLayout]
属性的指示,始终需要封送才能获得可预测的布局。您必须跳过
Marshal.StructureToPtr()
hoop。不管你是自己做还是让品沃克马歇尔帮你做


marshall.SizeOf(Type)
提供已封送的
结构的大小。有关它为何以这种方式工作的更多背景信息,请参阅。

探查器是否满足您的需要?不确定是否有人可以回答这个问题,但为什么托管结构的大小与非托管结构不同?两者都是相同的C#struct。@ChaosPandio:我需要在运行时获取任意结构的大小。简而言之,请看一看:Marshal.SizeOf有一个内部重载,它返回结构的托管大小。@Lazarus:封送器在通过P/Invoke将结构传递给本机方法之前,会对结构应用几个转换。托管内存中结构的布局是不同的。如果我没有弄错的话,StructLayout属性实际上会影响CLR在托管内存中布局结构的方式。只有使用LayoutKind.Auto时,CLR可以根据需要自由布局结构。使用LayoutKind.Sequential(C#中的默认值)和LayoutKind.Explicit可以获得可预测的布局。这是准确的。如果您自己不应用[StructLayout],则结构类型具有默认的[StructLayout]。与类不同,Sou不能使用反射来确定LayoutKind.Sequential或LayoutKind.Explicit结构的布局,并以此方式计算其大小?@dtb-Type.StructLayoutAttribute.Kind仍然是顺序的,无论它是否自动生成。反射不提供实际的内部布局,只提供封送的布局。反射根本不提供任何布局。它只告诉您结构及其属性的字段。StructLayout属性影响托管内存中结构的布局。使用LayoutKind.Sequential(自动生成或显式声明)和LayoutKind.Explicit(显式声明时),可以在托管内存中创建可预测的结构布局。由于布局是由StructLayout/FieldOffset属性确定的,可以使用反射来发现这些属性,因此应该可以计算布局及其大小。