4

我尝试在 c# 中编组一个非托管的 c++ dll,但编组器在创建我的联合时失败。

为什么这段代码会失败?

    [StructLayout(LayoutKind.Sequential)]
    public struct StructWithArray
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public int[] MySimpleArray;
        //More Stuff
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct Union
    {
        [FieldOffset(0)]
        public int Int; //Or anything else
        [FieldOffset(0), MarshalAs(UnmanagedType.Struct)]
        public StructWithArray MyStructWithArray;
        //More Structs
    }

然后构建联盟:

Union MyUnion = new Union();

如果我使用以下消息运行代码,它将失败:(已翻译)

{“无法加载程序集 [...] 的类型“联合”,因为它在偏移量 0 处包含一个对象字段,该字段未正确对齐或被非对象字段的字段重叠”:“联合”}

有什么建议么?

Ps:原始代码被大量简化以仅显示问题。还有更多的 Struct,Union 也包含在另一个 Struct 中。

4

1 回答 1

0

声明MySimpleArray为固定的不安全数组:

[StructLayout(LayoutKind.Sequential)]
public unsafe struct StructWithArray
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public fixed int MySimpleArray[2];
    //More Stuff
}

[StructLayout(LayoutKind.Explicit)]
public struct Union
{
    [FieldOffset(0)]
    public int Int; //Or anything else
    [FieldOffset(0), MarshalAs(UnmanagedType.Struct)]
    public StructWithArray MyStructWithArray;
    //More Structs
}
于 2013-05-29T13:25:47.323 回答