管理されていない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"}
助言がありますか?
追伸:元のコードは、問題のみを表示するように大幅に簡略化されています。より多くの構造体があり、連合は別の構造体にも含まれています。