C++ from C#: C++ function (in a DLL) returning false, but C# thinks it's true!
boolean, c#, c++, dllimport, pinvoke
Solution
Try `[return: MarshalAs (UnmanagedType.I1)]`. By default, C# interop marshals C# `bool` as the Win32 `BOOL`, which is the same as `int`, while C++ `bool` is one byte AFAIR. Thus, C#'s default marshaling expects the return value to be a `BOOL` in the `eax` register, and picks up some non-zero garbage because C++ `bool` is returned in `al`.
Problem
I'm writing a little C# app that calls a few functions in a C++ API. I have the C++ code building into a DLL, and the C# code calls the API using DllImport. (I am using a .DEF file for the C++ DLL so I don't need extern "C".) So far the API has one function, which currently does absolutely nothing: ``` bool Foo() { return false; } ``` In C#, I have the following: ``` public class FooAPI { [DllImport("Foo.dll")] public static extern bool Foo(); } ... bool b = FooAPI.Foo(); if (!b) { // Throw an exception } ``` My problem is that, for some reason, b is always evaluating to TRUE. I have a breakpoint on if (!b) and the debugger reports it as 'true', irrelevant of whatever the C++ function is returning. Is the C# bool the same as the C++ bool? Though even if this wasn't the case, I still don't get how it would find the return value to be 'true' :) Can anyone help me with this bizarre discrepancy? Thanks in advance!