.NETからNativeDLLの中にあるC++のboolが引数/戻り値の関数をP/Invokeで呼び出す
以下のようなコードを動かしたいと思ったとします。
// hoge.cpp // hoge.dll を生成する extern "C"{ __declspec(dllexport) bool isEven(int n) { return n % 2 == 0; } }
// fuga.cs using System; namespace Fuga { static class Program { static void Main() { int n = int.Parse(Console.ReadLine()); Console.Write(isEven(n)); } [DllImport("hoge.DLL")] extern static bool isEven(int n); } }
しかし、このコードは、期待したとおりに動かないことがあります。
それは何故かというと、bool型は通常UnmanagedType.Boolという、32bit整数型としてMarshalされるからなんですね。
これを正しく動作させるには、DllImportの次行に
[return: MarshalAs(UnmanagedType.U1)]
の一行を追加するようです。
引数の場合は、その直前に同じようにMarshalAsを書けば良いですね。