问题标签 [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.
c# - Compact Framework 中的 StructLayout "Pack" 属性是否有替代方案?
我想做以下事情:
由于紧凑框架不支持 Pack,是否有替代方案?
更新:显式设置结构并为每个结构提供 FieldOffset 也不起作用,因为它不会影响结构的打包方式
Update2:如果您尝试以下操作,CF 程序甚至不会运行,因为结构是如何打包的:
我知道这似乎很难相信,但如果你尝试一下,你就会看到。将其添加到 CF 项目并尝试运行它,您将收到 TypeLoadException。将偏移量分别更改为 0、4、8、10,它将起作用(但最终大小为 12)。
我希望也许有人有一个使用反射的解决方案,可以单独编组每个字段类型的大小(涉及递归以处理结构或类型数组中的结构)。
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
c# - 如何在 C# 中将固定字节/字符 [100] 转换为托管字符 []?
在 C# 中将固定字节或 char[100] 转换为托管 char[] 的最佳方法是什么?我最终不得不使用指针算法,我想知道是否有更简单的方法——比如 memcpy 或其他方法?
c# - 在使用联合调用 PInvoke 结构时,我在使用 StructLayout( LayoutKind.Explicit ) 时做错了什么?
下面是一个完整的程序。只要您不取消注释顶部的“#define BROKEN”,它就可以正常工作。中断是由于 PInvoke 未能正确编组联合。有问题的INPUT_RECORD
结构有许多子结构,可能会根据 EventType 中的值使用。
我不明白的是,当我只定义它的单个子结构时,KEY_EVENT_RECORD
它与偏移量 4 处的显式声明一起工作。但是当我在相同的偏移量处添加其他结构时,结构的内容完全被淹没了。
更新:
对于那些担心结构声明本身的人:
- bool 被视为 32 位值
- 数据上使用 offset(4) 的原因是允许 32 位结构对齐,这可以防止联合从偏移量 2 开始。
同样,我的问题根本不是使 PInvoke 工作,它试图弄清楚为什么这些额外的结构(假设在相同的偏移量)通过简单地添加它们来收集数据。
c# - 如果它们不在 COM 互操作中执行,我应该将 LayoutKind.Auto 用于我的结构吗?
默认情况下,C# 中的结构[StructLayout( LayoutKind.Sequential )]
的实现原因基本上是说明这些类型的对象通常用于 COM 互操作,并且它们的字段必须保持它们定义的顺序。类已LayoutKind.Auto
定义。
我的问题是我是否应该明确声明我的结构,[StructLayout( LayoutKind.Auto )]
这是否会给我带来任何优于默认设置的好处?我的意思是,如果结构是在stack上初始化的,它会有什么不同——即GC不必移动它们吗?当结构在堆上初始化时也会有帮助 - 即是某个类的一部分吗?
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# 论坛:
c# - 像这样更改字符串的内容是否会导致异常?
考虑以下代码:
通过运行此代码,我们能够更改字符串的内容而不会发生异常。我们不必为此声明任何不安全的代码。这段代码显然非常狡猾!
我的问题很简单:你认为上面的代码应该抛出异常吗?
[EDIT1:请注意,其他人已经为我尝试过,有些人得到了不同的结果 - 考虑到我正在做的事情的讨厌,这并不太令人惊讶......;)]
[EDIT2:请注意,我在 Windows 7 Ultimate 64 位上使用 Visual Studio 2010]
[EDIT3:将测试字符串设为 const,只是为了让它更加狡猾!]
c# - Marshal.PtrToStructure 和 String 的问题
我有以下课程
我用以下代码填充它:
我在位置 2 的 objBuffer 中有值(应该是字符串的开头),但字符串保持为空!
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 相同。
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 组合,但没有成功(显然)。我已经进行了一些搜索,但没有找到与我的情况相似的任何东西。