C#でNS_InitEmbedding

Gecko組み込みアプリでは、まずGeckoを初期化する必要があります。そのために必要な処理を行ってくれる関数がNS_InitEmbeddingです。

nsresult NS_InitEmbedding(nsILocalFile *aMozBinDirectory,
                       nsIDirectoryServiceProvider *aAppFileLocProvider);

この関数宣言を見ても分かるように、Mozillaをインストールしたディレクトリを表すnsILocalFileオブジェクトを引数に与える必要があります。どうしたものかと困って

$ strings libxpcom.so | grep -v "^_" | grep -v "^PR_" | grep -v "^PL_" | lv

とかして、libxpcom.soのシンボルを探ってたら、NS_New{Native,}LocalFileなる関数を発見。これはXPCOMGeckoが初期化される前から安全に利用できるとされている関数で、これを使ってnsILocalFileを作ることが出来そうです。
http://lxr.mozilla.org/mozilla/source/xpcom/build/nsXPCOM.h#187
また、もう一つの引数であるnsIDirectoryServiceProviderは、nsnullを与えても良いようなので、とりあえずはnullを与えておくことにします。
むぅ…。NS_NewLocalFileを使うのはいいとして、その引数であるnsAStringを作るのに苦しんでみたり。たかが文字列、されど文字列というか、文字列クラスを作るC関数を用意して置いて欲しいとか思った今日この頃…。とか更に見ると、nsILocalFileの引数もnullでいいそうな…。
で、とりあえず最小の例。DllImport属性では組み込みに関連するDllの名前がプラットフォーム毎に違うので、Windowsのものにあわせておいて、MonoのほうでDllmapするのがよさそうかも。

using System;
using System.Runtime.InteropServices;

unsafe class MonoEmbed {
    /**
     * nsresult NS_InitEmbedding(nsILocalFile *aMozBinDirectory,
     *                        nsIDirectoryServiceProvider *aAppFileLocProvider);
     */
    [DllImport("gtkembedmoz")]
    private static extern uint
    NS_InitEmbedding(IntPtr aMozBinDirectory, IntPtr aAppFileLocProvider);

    /**
     * nsresult NS_TermEmbedding();
     */
    [DllImport("gtkembedmoz")]
    private static extern uint NS_TermEmbedding();

    static void Main() {
        NS_InitEmbedding(IntPtr.Zero, IntPtr.Zero);
        NS_TermEmbedding();
    }
}