0

私は 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 をマネージド コードに変換/マーシャリングする方法がわかりません。ここでヒントをいただければ幸いです。

4

1 に答える 1