问题标签 [structlayout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1147 浏览

c# - 结构未正确对齐:System.TypeLoadException

我正在尝试在 C# 中创建以下结构,它是一个基于 C 的复杂结构,我尝试了大多数编组选项,但我总是得到“System.TypeLoadException”。

(附加信息:无法从程序集“WindowsFormsApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“WindowsFormsApplication1.COMPLEX_STRUCT”,因为它包含偏移量 8 处的对象字段,该对象字段不正确地对齐或重叠-对象字段。)

关于 IPV6_ADDR 结构,我尝试了 LayoutKind.Explicit 和 LayoutKind.Sequential,并且都尝试了:

我在 x64 机器上,但 IPV6_ADDR 结构与 8 个字节对齐,所以我不知道是什么问题。

我试图模仿的原始 C 结构:

0 投票
1 回答
49 浏览

c# - 与 StructLayouts 混淆时出现 FatalExecutionEngineError

我把结构布局弄乱了,我发现了一些我觉得很奇怪的东西:

以下代码按我的想法工作:

但是,如果将 classB.Value 更改为 int,则此代码将抛出上述 FatalExecutionEngineError。

谁能解释为什么或者如何解决?我知道这可能太复杂了,我只是在这里捣乱,但有人可能想要一些挑战。

0 投票
1 回答
493 浏览

c# - 使 StructLayout 在类上工作,因为它在结构上工作

在处理非托管代码时,我想更好地理解结构/类的映射。

我定义了以下结构:

与以下方法一起使用:

虽然只要是一个结构,它就可以很好地工作,但当我创建一个类 ProfileInfo时,LoadUserProfile 开始失败。ProfileInfo

我只是想知道为什么?
对我来说,StructLayout 以相同的方式应用于类或结构。

当我将其从 struct 更改为 class 时,导致 LoadUserProfile 失败的 ProfileInfo 内存表示的可能差异是什么?

0 投票
1 回答
92 浏览

c# - “DefaultCharSetAttribute”是否也适用于“StructLayoutAttribute.CharSet”?

C# 默认平台调用对方法参数和结构字段字符串都使用 ANSI 编组。

System.Runtime.InteropServices 包含一个属性“DefaultCharset”以将其更改为 Unicode。

来自 MSDN:“在程序集级别或模块级别应用 DefaultCharSetAttribute 属性,以设置对不包括用户指定的 CharSet 命名参数的任何 DllImportAttribute 调用的 CharSet 值。”

我的问题是:这个属性是否也为“StructLayoutAttribute.CharSet”设置了默认值?

谢谢!

0 投票
3 回答
820 浏览

c# - C# 中的“PROCESSENTRY32W”?

我声明了这样的函数Process32FirstW和结构PROCESSENTRY32W

调用时Process32FirstW(使用 64 位进程),我总是会TypeLoadException

ProcessEntry无法加载该类型,因为偏移量 44 处的对象字段对齐错误或与另一个字段重叠,该字段不是对象字段。

我还尝试在char[]结构string的. 我总是设置为 568,并从 C++ 程序(64 位构建)中复制了偏移数据:ProcessEntry.ExeFilePack=4Pack=8StructLayoutAttributeProcessEntry.Size

我不知道出了什么问题,那么如何 PROCESSENTRY32W 在 C# 中为 64 位应用程序声明?我必须使用 C++/CLI 还是我只是在这里做错了什么?


编辑:将此代码作为 64 位程序运行对我来说非常好

0 投票
3 回答
421 浏览

c++ - 怎么能不对 C++ 结构布局做出假设呢?

我刚刚从VC++ 14.0 (2015) 编译器中的错误中学到了?不应该假设结构的布局将如何在内存中结束。但是,我不明白在我见过的很多代码中这是多么普遍的做法。例如,Vulkan 图形 API 执行以下操作:

定义一个结构

然后填写其字段:

然后只需通过 memcpy 将结构(在主机内存中)复制到设备内存:

然后到 GPU,它定义了一个 UBO 来匹配该结构:

然后,在 GPU 方面,ubo 将始终匹配 uboVS。

这是相同的未定义行为吗?该代码是否依赖于完全按照定义布局的 uboVS 结构,或者对于双方(编译的 C++ 代码和编译的 SPIR-V 着色器)基本上生成相同的不同结构布局?(类似于https://www.securecoding.cert.org/confluence/display/c/EXP11-C中的第一个示例。+Do+not+make+assumptions+regarding+the+layout+of+structures+with+位域

这个问题并不特定于 Vulkan 或图形 API,我很好奇人们究竟可以假设什么以及何时可以将结构用作一块内存。我了解结构打包和对齐,但还有更多吗?

谢谢

0 投票
2 回答
1181 浏览

c# - C# StructLayout 包=?? 用于布尔值

在 C# 中,我创建了多个不同的结构,其中包含 16 个 bool 类型的变量。我将有几个不同的结构,然后将它们与其他数据类型组合成更复杂的结构。我需要将它们视为 2 个字节的长度。在下面的代码中,当我执行 Marshal.SizeOf 时,创建的类型为 CtrlWord1 的变量的长度将为 64,无论它是使用 0、1 还是 2 的 Pack 值创建的。

0 投票
2 回答
1192 浏览

c# - 结构中指针字段的大小

我必须定义一个使用不安全代码的结构,所以我必须设置每个字段的 FieldOffset 值。但我无法定义指针的大小。这是代码:

给出一个错误,因为 IntPtr.Size 不是一个常量表达式,当然这个也不能编译:

归结为问题标题,更多的是如何在 FieldOffset 定义中设置特定的“32bit 64bit compile”指针数据大小。

编辑:我也不能把“public int[] SomeNumbers;” 结构末尾的字段,因为我的结构中有 2 个不同的数组.. 像“public int [] SomeOtherNumbers;”

0 投票
1 回答
436 浏览

c# - 显式结构布局上的未分配字段

我想生成一个 C# sqrt 基准,但是一些 sqrt 函数需要一个联合来进行按位计算。

我的工会被定义为:

和下一个代码产生一个未分配的字段错误u.i

我知道 ui 是在 ux 也被分配时被分配的,所以是否可以在编译时忽略未分配的字段错误而无需显式u.i分配?

0 投票
1 回答
251 浏览

c# - 为什么 C# 可以在运行时处理这种明显愚蠢的对象提升?

我非常喜欢 C# 语言。我只是在玩,永远不会在生产代码中使用下面的代码。显然编译器被结构的布局所迷惑。但是为什么 Super 类上的字符串仍然可以在运行时读写呢?我会预料到一些内存访问冲突。在运行时检查类型,它说它是 Base 类型,请参阅NoProblem()函数执行。没有实例化 Super 类。

它怎么能这样运作?