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

c# - Compact Framework 中的 StructLayout "Pack" 属性是否有替代方案?

我想做以下事情:

由于紧凑框架不支持 Pack,是否有替代方案?

更新:显式设置结构并为每个结构提供 FieldOffset 也不起作用,因为它不会影响结构的打包方式

Update2:如果您尝试以下操作,CF 程序甚至不会运行,因为结构是如何打包的:

我知道这似乎很难相信,但如果你尝试一下,你就会看到。将其添加到 CF 项目并尝试运行它,您将收到 TypeLoadException。将偏移量分别更改为 0、4、8、10,它将起作用(但最终大小为 12)。

我希望也许有人有一个使用反射的解决方案,可以单独编组每个字段类型的大小(涉及递归以处理结构或类型数组中的结构)。

0 投票
2 回答
15805 浏览

c# - C# StructLayout.Explicit 问题

我试图理解为什么下面的第二个例子没有问题,但第一个例子给了我下面的例外。在我看来,这两个例子都应该根据描述给出一个例外。任何人都可以启发我吗?

未处理的异常:System.TypeLoadException:无法从程序集“StructTest,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“StructTest.OuterType”,因为它包含偏移量 0 处的对象字段,该对象字段未正确对齐或重叠通过非对象字段。
在 StructTest.Program.Main(String[] args) 按任意键继续。. .

示例 1


示例 2

0 投票
2 回答
3761 浏览

c# - 如何在 C# 中将固定字节/字符 [100] 转换为托管字符 []?

在 C# 中将固定字节或 char[100] 转换为托管 char[] 的最佳方法是什么?我最终不得不使用指针算法,我想知道是否有更简单的方法——比如 memcpy 或其他方法?

0 投票
6 回答
3079 浏览

c# - 在使用联合调用 PInvoke 结构时,我在使用 StructLayout( LayoutKind.Explicit ) 时做错了什么?

下面是一个完整的程序。只要您不取消注释顶部的“#define BROKEN”,它就可以正常工作。中断是由于 PInvoke 未能正确编组联合。有问题的INPUT_RECORD结构有许多子结构,可能会根据 EventType 中的值使用。

我不明白的是,当我只定义它的单个子结构时,KEY_EVENT_RECORD它与偏移量 4 处的显式声明一起工作。但是当我在相同的偏移量处添加其他结构时,结构的内容完全被淹没了。

更新:

对于那些担心结构声明本身的人:

  1. bool 被视为 32 位值
  2. 数据上使用 offset(4) 的原因是允许 32 位结构对齐,这可以防止联合从偏移量 2 开始。

同样,我的问题根本不是使 PInvoke 工作,它试图弄清楚为什么这些额外的结构(假设在相同的偏移量)通过简单地添加它们来收集数据。

0 投票
2 回答
817 浏览

c# - 如果它们不在 COM 互操作中执行,我应该将 LayoutKind.Auto 用于我的结构吗?

默认情况下,C# 中的结构[StructLayout( LayoutKind.Sequential )]的实现原因基本上是说明这些类型的对象通常用于 COM 互操作,并且它们的字段必须保持它们定义的顺序。类已LayoutKind.Auto定义。

我的问题是我是否应该明确声明我的结构,[StructLayout( LayoutKind.Auto )]这是否会给我带来任何优于默认设置的好处?我的意思是,如果结构是在stack上初始化的,它会有什么不同——即GC不必移动它们吗?当结构在堆上初始化时也会有帮助 - 即是某个类的一部分吗?

0 投票
6 回答
10597 浏览

c# - 如果结构包含 DateTime 字段,为什么 LayoutKind.Sequential 的工作方式会有所不同?

如果结构包含 DateTime 字段,为什么 LayoutKind.Sequential 的工作方式会有所不同?

考虑以下代码(必须在启用“不安全”的情况下编译的控制台应用程序):

现在,如果我运行上面的代码,我会得到类似于以下内容的输出:

struct 的地址 = 40F2CC
First 的地址 = 40F2D4 NotFirst
的地址 = 40F2CC

注意 First 的地址与结构体的地址不同;但是,NotFirst地址与结构的地址相同。

现在注释掉结构中的“DateTime WTF”字段,然后再次运行它。这一次,我得到类似这样的输出:

struct 的地址 = 15F2E0
First 的地址 = 15F2E0 NotFirst
的地址 = 15F2E8

现在“First”确实与结构具有相同的地址。

考虑到 LayoutKind.Sequential 的使用,我发现这种行为令人惊讶。任何人都可以提供解释吗?与使用 Com DATETIME 类型的 C/C++ 结构进行互操作时,此行为是否有任何影响?

[编辑] 注意:我已经验证,当您使用 Marshal.StructureToPtr() 编组结构时,数据正确的顺序编组,“First”字段位于第一位。这似乎表明它可以与互操作一起正常工作。奥秘在于为什么内部布局会发生变化——当然,内部布局从来没有被指定,所以编译器可以做它喜欢的事情。

[EDIT2] 从结构声明中删除了“不安全”(它是我正在做的一些测试留下的)。

[EDIT3] 这个问题的原始来源来自 MSDN C# 论坛:

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/fb84bf1d-d9b3-4e91-823e-988257504b30

0 投票
2 回答
593 浏览

c# - 像这样更改字符串的内容是否会导致异常?

考虑以下代码:

通过运行此代码,我们能够更改字符串的内容而不会发生异常。我们不必为此声明任何不安全的代码。这段代码显然非常狡猾!

我的问题很简单:你认为上面的代码应该抛出异常吗?

[EDIT1:请注意,其他人已经为我尝试过,有些人得到了不同的结果 - 考虑到我正在做的事情的讨厌,这并不太令人惊讶......;)]

[EDIT2:请注意,我在 Windows 7 Ultimate 64 位上使用 Visual Studio 2010]

[EDIT3:将测试字符串设为 const,只是为了让它更加狡猾!]

0 投票
1 回答
1467 浏览

c# - Marshal.PtrToStructure 和 String 的问题

我有以下课程

我用以下代码填充它:

我在位置 2 的 objBuffer 中有值(应该是字符串的开头),但字符串保持为空!

0 投票
3 回答
3655 浏览

c# - 使用 FieldOffset 意外行为的结构

我试图理解显式结构布局和结构覆盖,但我没有看到我期望的行为。鉴于以下代码:

我希望这个结果是这样的:

IntField1:1
IntField2:2 CharArray
:ABCDEF
SomeByte:1
SubStruct:
{ CharArray1:ABCDEF CharArray2
:ABCD
CharArray3:E}

但结果是:

IntField1:1
IntField2:2 CharArray
:ABCD
SomeByte:1
SubStruct:
{ CharArray1:ABCD CharArray2:
ABCD CharArray3
:EF}

为什么 TestStruct 中的 CharArray 的长度为 4?我预计它有 6 个字符 ABCDEF,但它只包含 ABCD。TestStruct2.CharArray1 相同。

0 投票
2 回答
1165 浏览

c# - 封送包含 char* 成员的非托管结构

我正在使用从非托管代码到托管 C# 代码的回调函数。回调有一个参数void* eventData。EventData 可以是几种不同的结构类型。在我的 C# 代码中,我将 eventData 定义为 anIntPtr并用于 Marshal.PtrToStructure获取结构。对于大多数结构我没有问题。但是,我遇到了编组这个问题:

这是我对结构的 C# 定义:

剂量和 nbParameters 值已正确转换。这是我正在努力解决的参数数组。长度始终为 1,对于该实例,Parameters.text 没有什么可理解的,Parameters.value 远大于应有的值。

似乎这与 char * 是不确定的长度有关。虽然,我是新来的 StructLayout/MarshalAs 的东西所以不太确定这一切。我玩过各种 MarshalAs、LayoutKind.Explicit 和 FieldOffset 组合,但没有成功(显然)。我已经进行了一些搜索,但没有找到与我的情况相似的任何东西。