在 C# 中使用非原始类型重新创建 C++ 联合类型时出现对齐错误

Posted

技术标签:

【中文标题】在 C# 中使用非原始类型重新创建 C++ 联合类型时出现对齐错误【英文标题】:Alignment error recreating C++ union type with non-primitive types in C# 【发布时间】:2018-06-22 17:41:59 【问题描述】:

我在 C++ 中有一个简单的联合(字节数组和一个短),我试图将其移植到 C# 并获得 Could not load type ... Union ... because it contains an object field at offset 0 that is incorrectly aligned or overlapped by a non-object field. 我怀疑我的实现不起作用,因为我将数组作为结构成员之一。

现有的 C++ 联合:

union 
    char    c[2];
    short        data;
 u;

尝试的 C# 实现:

[StructLayout(LayoutKind.Explicit, Size =2)]
public struct Union

    [MarshalAs(UnmanagedType.LPArray)]
    [FieldOffset(0)]
    public byte[] c;
    [FieldOffset(0)]
    public short data;

之前回答过类似的问题,但它似乎只适用于原始类型:C++ union in C#

提前谢谢你。

【问题讨论】:

【参考方案1】:

您是否尝试过“StructLayout(LayoutKind.Explicit, Size =2, Pack=1)”?似乎是 C# 默认为 4 字节打包大小的问题。

【讨论】:

以上是关于在 C# 中使用非原始类型重新创建 C++ 联合类型时出现对齐错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GraalVM 从 C++ 调用具有非原始类型作为参数的 Java 入口点方法

使用 COM 互操作从非托管 C++ 访问 c# 属性

在 C# 中使用非托管 C++ 代码对所有双精度类型返回 0

如何从 C# 导入和使用非托管 C++ 类?

在 C++ 非托管应用程序中使用 C# 托管应用程序类

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?