これまで見てきた例のどれも、再帰参照を含む構造体の共用体を含む構造体のマーシャリングの問題に対処しているようには見えません。これらを含む構造体のマーシャラーを作成しようとしていますが、これまでのところ失敗しています。
例えば:
typedef enum {
My_StructA = 0x7878,
My_StructB
} MyStructTag;
typedef struct _MyStruct MyStruct;
struct _MyStruct {
MyStructTag discriminator;
union {
struct {
int a;
int b;
} StructA;
struct {
int c;
MyStruct* d;
} StructB;
} MyUnion;
};
次のように構造を定義しようとしました。
type MyStructTag =
| My_StructA = 0x7878
| My_StructB = 0x7879
[<Struct; StructLayout(LayoutKind.Sequential)>]
type StructA =
val mutable a : int
val mutable b : int
[<Struct; StructLayout(LayoutKind.Sequential)>]
type StructB =
val mutable c : int
val mutable d : MyStruct
[<Struct; StructLayout(LayoutKind.Explicit)>]
type MyStruct =
[<FieldOffset(0)>] val discriminator : MyStructTag
[<FieldOffset(4)>] val structA : StructA
[<FieldOffset(4)>] val structB : StructB
MyStruct を明示的に定義した理由は、この構造体のカスタム マーシャラーを作成するときに Marshal.OffsetOf() と Marshal.SizeOf() を使用できるようにするためです。私が見た限りでは、カスタム マーシャラーを作成することがユニオンを処理する唯一の方法です。私がそれについて間違っている場合は、参考にしていただければ幸いです。
上記のコードを書いているときに受け取るエラーは次のとおりです。
error FS0039: The type 'MyStruct' is not defined
これは、再帰的に定義できるのは判別共用体型だけだからだと思います。ただし、F# でこれらの構造を表現する他の方法は知りません。
よろしくお願いいたします。