我不是 COM 或 C++/C# 编组方面的专家,可以在这种情况下使用一些帮助:
本机代码:
typedef struct _Foo {
FooType a; // enum
WCHAR b[16];
WCHAR c[16];
BOOL d;
ULONG size;
} Foo;
typedef struct _Bar {
GUID a;
WCHAR b[16];
WCHAR c[16];
BOOL d;
} Bar;
typedef struct _Baz {
FILETIME a;
FILETIME b;
ULONG c;
ULONG d;
GUID e;
} Baz;
typedef struct _FooBarBaz
{
SomeType type; // enum
[switch_is(type)] union
{
[case(SomeType.A)]
Foo a;
[case(SomeType.B)]
Bar b;
[case(SomeType.C)]
Baz b;
} data;
} FooBarBaz;
托管代码:
[StructLayout(LayoutKind.Sequential)]
internal struct Foo
{
public FooType a;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] b;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] c;
[MarshalAs(UnmanagedType.Bool)]
public bool d;
[MarshalAs(UnmanagedType.U4)]
public uint e;
}
[StructLayout(LayoutKind.Sequential)]
internal struct Bar
{
public Guid a;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] b;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] c;
[MarshalAs(UnmanagedType.Bool)]
public bool d;
}
[StructLayout(LayoutKind.Sequential)]
internal struct Baz
{
public ComTypes.FILETIME a;
public ComTypes.FILETIME b;
[MarshalAs(UnmanagedType.U4)]
public uint c;
[MarshalAs(UnmanagedType.U4)]
public uint d;
public Guid e;
}
internal struct FooBarBaz
{
public SomeType Type;
// ??????
}
我不确定如何将本机结构 FooBarBaz 转换/编组为托管代码。任何提示将不胜感激。