C# で Webkit ベースのブラウザを作成する

 C#Webkit レタリングエンジンベースのブラウザを作るためのライブラリとして、Open-Webkit-SharpWebKit.NET などがあります。Open-Webkit-Sharp の方が Webkit.NET よりも新しく、Webkit.NETをベースにして開発されたものですので、こちらを使用します。

導入準備

1. ライブラリプロジェクトのダウンロード
 Open-Webkit-Sharp から 2012年6月24日時点で最新版の OpenWebKitSharp 3.0.1.0023.rar をダウンロードします。

2. ライブラリプロジェクトのビルド
 ダウンロードした rar ファイルを解凍ファイルを使用して任意のフォルダへ展開します。
 すると、「open-webkit-sharp」というフォルダが生成されますので、その中にある「OpenWebKitSharp_2010.sln」をダブルクリックしてVisual Studio 2010 で開きます。
 それから、メニューの「ビルド」、「ソリューションのビルド」を選び(または、F6 キー を押す)、ソリューションをビルドします(この時にもしビルドエラーが出た場合は、もう一度ビルドし直すと成功します)。
 ソリューションの各プロジェクトは、「open-webkit-sharp」フォルダ内にある「build」フォルダに一括でビルドされます。これらが正しくビルドされていることを確認するために、「build」フォルダ内の「Example.exe」を実行します。エラーなく正常に起動及び動作した場合は、次の手順へ進みます。

ライブラリを導入するプロジェクトの作成

1. プロジェクトの作成

2. 対象のフレームワークの変更
 プロジェクトのプロパティを開き、「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.Net Framework 4」に変更します。
 この手順は、ライブラリが「.NET Framework 4」のフルパッケージでないと使用できない「System.Net」コンポーネントに依存しているために必要です。

3. ビルド
 プロジェクトのビルドフォルダを確保するためにソリューションのビルドを実行します。なお、プロジェクト固有のビルドフォルダがあり、自動生成させないのであれば、この手順はスキップして構いません。

4. コンポーネントの追加
 まず、「System.Net」コンポーネントをプロジェクトの参照設定に追加します。
 次に、「build」フォルダ内の「OpenWebKitSharp.dll」と「WebKit.Interop.dll」を追加します。
 その後、「WebKit.Interop.dll」に関しては、ソリューションエクスプローラの参照設定内の「WebKit.Interop」を右クリックし「プロパティ」をクリックします。「相互運用機能型の埋め込み」オプションが「True」になっている場合は、「False」へ変更します。

5. ライブラリコンポーネントのコピー
 「open-webkit-sharp」フォルダ内の「Core」フォルダから、「Webkit.Interop.dll」以外の全てのファイルを、手順3で作成したビルドフォルダへコピーします(自動生成でないプロジェクト固有のビルドフォルダがある場合は、そちらにコピー)。

6. デバッグの設定
 最重要。プロジェクトのデバッガーの設定を変更します。
 プロジェクトのプロパティの「デバッグ」ページ内にある「デバッガーを有効にする」の「Visual Studio ホスティングプロセスを有効にする」のチェックを外します。このチェックが外れていないと、Visual Studio からのデバッグ起動はエラーが発生するため出来ません。

コーディング

 Visual Studio のデザイナーから Form の Load イベントを自動生成します。その後、Form のコードエディタを開き、以下のように編集します。

private WebKitBrowser webkit = default(WebKitBrowser);

public Form1()
{
    InitializeComponent();

    webkit = new WebKitBrowser()
    {
        Dock = DockStyle.Fill,
        Parent = this
    };
}

private void Form1_Load(object sender, EventArgs e)
{
    webkit.Navigate("http://www.google.co.jp/");
}

以上で、完成です。

トラブルシューティング

動くまでに問題が結構な程度に発生したので、トラブルシューティングをまとめておきます。

  • アプリケーションの起動時に「エラーメッセージ(e0434352)」または「(HRESULT からの例外: 0x80131040)」が出る。
    導入準備の手順2をやった後、ライブラリを導入するプロジェクトの作成の手順4をやり直します。
  • アプリケーションの起動時に「0x80029C4A (TYPE_E_CANTLOADLIBRARY)」が出る。
    ライブラリを導入するプロジェクトの作成の手順5が正しく行われていません。「Core」フォルダ内にある「OpenWebKitSharp.manifest」ファイルを、アプリケーションのビルドフォルダへコピーします。
  • アプリケーションの起動時に「(HRESULT からの例外: 0x800736B1)」が出る。
    Visual C++ ランタイムライブラリをインストールします。
  • デバッグ開始時に「外部コンポーネントが例外をスローしました。」が出る。
    ライブラリを導入するプロジェクトの作成の手順6をやり直します。

まとめ

 実装までの手間が多い割には、例外エラーの発生率が高めで不安定なような気がします。ライブラリをコンパイルすると生成される「Example.exe」も、長時間使用しているとアプリ落ちすることがあり、ライブラリとしてきちんと使えるものなのか不安な気持ちになることもありました。あとは、初期化処理が重いのか、起動してから最初のページが表示されるまでにかかる時間の遅さが、目に見えて分かるところも気になりますね。ライブラリの挙動改善が待ち遠しいです。というか、そもそもC#ではなく最初からC++で実装した方が手っ取り早いかもしれません。