読者です 読者をやめる 読者になる 読者になる

.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を書けば良いですね。

参考:CA1414: ブール型の P/Invoke 引数を MarshalAs に設定します