4

管理されていないc++dllをc#でマーシャリングしようとしましたが、ユニオンを作成するときにマーシャラーが失敗します。

このコードが失敗するのはなぜですか?

    [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();

次のメッセージを含むコードを実行すると失敗します:(翻訳済み)

{"アセンブリのタイプ"Union"[...]は、オフセット0にObjectfieldが含まれていたため、ロードできませんでした。これは、正しく位置合わせされていないか、ObjectFieldではないフィールドとオーバーラップしています": "Union"}

助言がありますか?

追伸:元のコードは、問題のみを表示するように大幅に簡略化されています。より多くの構造体があり、連合は別の構造体にも含まれています。

4

1 に答える 1