问题标签 [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 回答
111 浏览

c# - 标记这样的对象是合法代码吗?

我曾经编写过一段代码来为 Task 添加名称。下面的代码似乎做同样的事情,但代码更少。但我想知道,这是否合法。是否准备好生产代码。垃圾回收呢?在代码中移动的类的实例怎么样(因为它没有固定),它在移动时是否仍然有效?如何将此代码进行测试?

0 投票
1 回答
251 浏览

vb.net - StructLayout 和 FieldOffset 的未定义行为

我已经使用 PtrToStructure 函数(在 VB.NET 中)从有效指针中成功提取了一个结构对象,但是某些对象成员的结果不正确(与 C++ 示例相比):

代码是:

我找不到 WindowWidth 和 WindowHeight 的 FieldOffset 参数的确切值。问题是为什么以及如何解决它们?

0 投票
1 回答
199 浏览

vb.net - fieldoffset 的未定义行为

我已经使用 PtrToStructure 函数(在 vb.NET 中)从有效指针中成功提取了结构对象,问题是“FrameRects”字段与从 C++ 示例中获得的值相比具有无效值:

vb.NET 代码是:

StructLayout(LayoutKind.Explicit, pack:=1, CharSet:=CharSet.Ansi)> _"

"StructLayout(LayoutKind.Explicit, pack:=1, CharSet:=CharSet.Ansi)> _

C++ 代码是:

0 投票
0 回答
62 浏览

c# - FxCop 警告不会消失

此类的一个对象将被传递给 API 调用。我实施了以下警告中的第一个建议:

为了降低安全风险,将字段“Resource.k__BackingField”编组为 Unicode,方法是将“资源”上的 StructLayout.CharSet 设置为 CharSet.Unicode,或者将字段显式编组为 UnmanagedType.LPWStr。如果您需要将此字符串编组为 ANSI 或系统相关,请显式指定 MarshalAs,使用 BestFitMapping 属性关闭最佳拟合映射,并为了增加安全性,打开 ThrowOnUnmappableChar。

现在我的班级看起来与此类似:

但 FxCop 仍然发出同样的警告。它想要什么?

0 投票
1 回答
493 浏览

c# - [StructLayout(LayoutKind.Sequential)] 和 TypeAttributes.SequentialLayout 的区别?

我使用动态构建 P/Invoke 结构

之后,我构造StructLayoutAttribute并将其添加到这样的类型

这相当于设置


现在,无论我是否将 应用于结构,代码都可以正常StructLayoutAttribute工作。

看起来,设置属性是不必要的冗余,或者我错过了什么?

0 投票
3 回答
2037 浏览

c# - 将 sbyte[] 固定为字符串 C#

我正在尝试使用StrucLayoutand从内存中获取字符串FieldOffset

但是我在理解如何byte工作时遇到了很多麻烦。

这是我的代码 ATM :

这段代码returnsT。预期结果是TEZ

关于我为什么做错的任何建议?谢谢

0 投票
1 回答
197 浏览

resharper - 我可以确保 resharper 不会更改此类中字段的顺序吗?

我正在使用这个 NetResource 类将文件发送到网络驱动器,它看起来像这样:

现在,这些字段的顺序保持不变非常重要,正如StructLayout属性所暗示的那样。

但是,当有人运行 resharper 清理时,resharper 决定移动字段,这会破坏代码。

有什么方法可以告诉 rehsarper 不要惹它?我觉得如果我不能做到这一点,那么最终有人会破坏代码并且不知道去哪里找。

但我认为一个平庸的解决方案是创建一个可以检查布局是否符合预期的单元测试。

编辑:我已经看到了这个答案,但它已经过时了,需要更新更清晰的设置。我也不能保证同事使用这种重新锐化器设置。我正在寻找一种将其添加到代码中的方法,就像您可以做的那样// ReSharper disable once InconsistentNaming

0 投票
1 回答
119 浏览

c# - 如果使用了 FieldOffset,必须在每个类/结构成员上使用它吗?

考虑我需要确保以非常特定的方式将类/结构映射到内存的情况,可能是由于需要匹配外部协议:

然后我考虑做一个“覆盖”(这是一个合适的术语吗?),所以我可以直接访问内存:

但这会变得耗时且容易出错(如果发生变化,我很容易搞砸更新所有FieldOffset值) - 并且由于我不完全理解的原因而被指出实际上是无效的:

未处理的异常。System.TypeLoadException:无法从程序集“a2bbzf3y.exe,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“SYSTEM_INFO2”,因为它包含偏移量 0 处的对象字段,该对象字段未正确对齐或重叠-对象字段。命令由信号 6 终止

是否可以结合使用这两种方法,其中Buffer覆盖成员,但除了所有成员之外 Buffer的所有成员都自动按顺序对齐而没有填充?我无法从文档中找出是否允许这样做,并且我只能强制某些成员偏移,而其他成员会自动决定。

0 投票
1 回答
81 浏览

c# - C# StructLayout 和处置

我设计了一个名为 ReceiveBuffer 的 StructLayout,在 ReceiveBuffer 内部,我有一个非托管类型的数组来存储数据。代码如下所示。

我想在这个结构中实现 IDisposable 方法,以便在不需要时正确处理 ReceiveBuffer。我在 MSDN 上查看了一些示例,但大多数情况是在类中使用而不是在结构中使用。我不确定如何在结构中管理它。如何在这样的结构中实现 IDisposible?

0 投票
1 回答
126 浏览

c# - Marshal.Sizeof() 返回意外值

我正在调试由第 3 方编写的 C# 代码。该项目是一个旧的 C++ 项目,由承包商用 C# 重写,我无权访问承包商。我编写了原始的 C++ 版本。

问题是当 C# 代码获取表示通过 UDP 连接接收的数据的结构的大小时。

该结构定义为:

此结构的大小检索为:

并且返回的值是 17 而不是预期的 13。有 4 个字节的差异,我怀疑ip成员,但这只是因为它的表达方式与其他成员不同(使用“新”),但我没有其他依据来决定.

我通常不会在我的 C# 代码中使用这种类型的封送处理来毫无问题地解析接收到的数据包,所以我不知道如何修改这个结构定义以使其在大小上与原始版本“对齐”。

我可以用

但那是作弊,对吧?

我可以以某种方式修改此布局以使尺寸正确吗?