Por que DllImport for C bool como UnmanagedType.I1 é lançado, mas como o byte funciona

Aqui está um código C simples (projeto VS C ++ 2013, "compilado como C"):
typedef struct {
    bool bool_value;
} BoolContainer;

BoolContainer create_bool_container (bool bool_value)
{
    return (BoolContainer) { bool_value };
}
Aqui está o meu wrapper P / Invoke
public partial class NativeMethods
{
    [DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
    public static extern BoolContainer create_bool_container([MarshalAs(UnmanagedType.I1)] bool bool_value);
}
Aqui estão as versões gerenciadas doBoolContainer:

Primeiro está jogandoMarshalDirectiveException: 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;
}

Em segundo lugar está trabalhando:

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

Código de teste:

BoolContainer boolContainer = NativeMethods.create_bool_container(true);

Parece serDllImport ignoraMarshalAs para qualquer membro booleano na estrutura retornada. Existe uma maneira de manterbool na declaração gerenciada?

questionAnswers(1)

yourAnswerToTheQuestion