Я пытаюсь вывести на управляемую сторону (C #) структуру, построенную на C.
Предположим, эта структура (код C):
typedef struct S{
int i;
union{
TypeA a;
TypeB b;
TypeC c;
}uni;
} S;
Теперь я создаю классы-оболочки C #:
[StructLayout(LayoutKind.Explicit)]
public class S
{
[FieldOffset(0)]
public int i;
[FieldOffset(4)]
public TypeA a;
[FieldOffset(4)]
public TypeB b;
[FieldOffset(4)]
public TypeC c;
}
И у меня есть метод PInvoke для получения объекта S:
(Реализация C создает и возвращает структуру S с TypeA в объединенном поле)
[DllImport("Library.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.S)]
public static extern S getUnionStruct();
Где-то в основной функции я делаю:
S s = getUnionStruct();
Console.WriteLine("unions type: {0}",(S.a).GetType());
Результат - "AssembleName.TypeC" (???)
.net Framework принимает TypeC, потому что это был последний объявленный. Я также заметил, что если размер TypeC меньше, чем TypeA, я не могу прочитать все поля TypeA ..
Это ошибка в .net или я должен делать что-то другое?