Почему DllImport для C bool как UnmanagedType.I1 бросает, но как байт это работает

Вот простой код на C (проект VS 2013 C ++, "составлено как C "):
typedef struct {
    bool bool_value;
} BoolContainer;

BoolContainer create_bool_container (bool bool_value)
{
    return (BoolContainer) { bool_value };
}
Вот мой P / Invoke обертка
public partial class NativeMethods
{
    [DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
    public static extern BoolContainer create_bool_container([MarshalAs(UnmanagedType.I1)] bool bool_value);
}
Вот управляемые версии:BoolContainer

Первый бросок:MarshalDirectiveException: Method's type signature is not PInvoke compatible.

public struct BoolContainer // Marshal.SizeOf(typeof(BoolContainer)) = 1
{
    [MarshalAs(UnmanagedType.I1)] // same with UnmanagedType.U1
    public bool bool_value;
}

Второй работает:

public struct BoolContainer // Marshal.SizeOf(typeof(BoolContainer)) = 1
{
    public byte bool_value;
}

Тестовый код:

BoolContainer boolContainer = NativeMethods.create_bool_container(true);

Это похоже наDllImport игнорируемыхMarshalAs для любых логических членов в возвращаемой структуре. Есть ли способ сохранитьbool в управляемой декларации?

Ответы на вопрос(1)

Ваш ответ на вопрос