アジョブジ星通信

日常系バンザイ。

Mono.Posix の Stdlib が Windows でも使えるわけ

さっきクソみたいな乞食記事を投下してしまったので真面目なことを書きます。

Mono には Unix 特有の機能をサポートするための Mono.Posix というライブラリがありますが、これの Mono.Unix.Native.Stdlib が結構 Windows でも動くのでその話を。まぁ malloc と free しか試してないけどCRT 関数一覧にあるのは動くはず。

素の Windows で動くもの

[DllImport(LIBC)] の LIBC は定数 "msvcrt" です。なので Windows の標準 C ライブラリを直接叩くことになっています。 Mono 環境下では /etc/mono/config に変換テーブルが入っていて、それを使って libc を参照するように書き換えているようです。

$ cat /etc/mono/config
<configuration>
	<dllmap dll="i:cygwin1.dll" target="libc.so.6" os="!windows" />
	<dllmap dll="libc" target="libc.so.6" os="!windows"/>
	<dllmap dll="intl" target="libc.so.6" os="!windows"/>
	<dllmap dll="intl" name="bind_textdomain_codeset" target="libc.so.6" os="solaris"/>
	<dllmap dll="libintl" name="bind_textdomain_codeset" target="libc.so.6" os="solaris"/>
	<dllmap dll="libintl" target="libc.so.6" os="!windows"/>
	<dllmap dll="i:libxslt.dll" target="libxslt.so" os="!windows"/>
	<dllmap dll="i:odbc32.dll" target="libodbc.so" os="!windows"/>
	<dllmap dll="i:odbc32.dll" target="libiodbc.dylib" os="osx"/>
	<dllmap dll="oci" target="libclntsh.so" os="!windows"/>
	<dllmap dll="db2cli" target="libdb2_36.so" os="!windows"/>
	<dllmap dll="MonoPosixHelper" target="libMonoPosixHelper.so" os="!windows" />
	<dllmap dll="i:msvcrt" target="libc.so.6" os="!windows"/>
	<dllmap dll="i:msvcrt.dll" target="libc.so.6" os="!windows"/>
	<dllmap dll="sqlite" target="libsqlite.so.0" os="!windows"/>
	<dllmap dll="sqlite3" target="libsqlite3.so.0" os="!windows"/>
	<dllmap dll="libX11" target="libX11.so.6" os="!windows" />
	<dllmap dll="libcairo-2.dll" target="libcairo.so.2" os="!windows"/>
	<dllmap dll="libcairo-2.dll" target="libcairo.2.dylib" os="osx"/>
	<dllmap dll="libcups" target="libcups.so.2" os="!windows"/>
	<dllmap dll="libcups" target="libcups.dylib" os="osx"/>
	<dllmap dll="i:kernel32.dll">
		<dllentry dll="__Internal" name="CopyMemory" target="mono_win32_compat_CopyMemory"/>W
		<dllentry dll="__Internal" name="FillMemory" target="mono_win32_compat_FillMemory"/>
		<dllentry dll="__Internal" name="MoveMemory" target="mono_win32_compat_MoveMemory"/>
		<dllentry dll="__Internal" name="ZeroMemory" target="mono_win32_compat_ZeroMemory"/>
	</dllmap>
	<dllmap dll="gdiplus" target="/usr/lib/libgdiplus.so" os="!windows"/>
	<dllmap dll="gdiplus.dll" target="/usr/lib/libgdiplus.so"  os="!windows"/>
</configuration>

Mono がインストールされていると動くもの

[DllImport(MPH)] となっているものは MonoPosixHelper というライブラリを経由しています。これは Mono や GtkSharp に含まれており、私の環境では GtkSharp が PATH に入っていたため利用可能でした。

というわけで

Windows の主要 C ライブラリを使ったところで Mono でもちゃんと動きますたぶん。逆も単純なものならできます。雑なレポートは以上です。