Ни один из примеров, которые я видел до сих пор, кажется, не рассматривал проблему маршалинга структуры, содержащей объединение структур, которые содержат рекурсивные ссылки.Я пытаюсь написать маршалер для структуры, которая содержит их и пока что не удалась.
Например:
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 #.
Заранее благодарим вас за ваше время.