WinFormsでCefSharpをAnyCPU構成で使う方法

2019年12月9日

今回もGitHubのリポジトリーがあります。
AnyCPUで動く状態のサンプルを置いてます。

CefSharpについて

仕事でCefSharp(chromium embedded framework c#)を使う機会があったので、記録に残しておく。
CefSharpで何ができるかというと、クライアントアプリケーションでChromiumベースの自前ブラウザを作ることができる。

顧客がIEしか使わないうえに、バージョンめちゃ古い。
碌に使わないけど、firefoxとchromeブラウザにも対応させ、最大公約数を達成させるために、デザインの微調整やJavaScriptの微妙な挙動の違いを修正していく。
ブラウザの差異を極力なくすための作業は想像以上に大変です。

さて、CefSharpの何がイイかというと、上記のような複数ブラウザの微妙な挙動の違いを忘れて、Chromeだけのことを考えればよくなるという点でしょう。

※厳密にはChromeと多少の違いが発生したりする。この違いが発生したときはしんどいですね。。。

しかも、あたかも独自にブラウザを実装してますぜ感を出せるので、もしかしたら見積もり価格も大いに盛れるかもしれません。

以下サンプルでは、.NET Coreではなく、.Net FrameworkでCefSharpを使う

たぶんWinFormsを業務上で使う場合、.NET Coreを使うという選択肢は少ないだろうなと。やるならWPFで作るだろうから、今回のWinFormsでは.NET Frameworkでサンプルを作っていく。WPFでの設定方法も次回以降やっていく予定。

参考にしたサイト

英語のサイトですが、こちらです。

プロジェクト作成

特に目新しいこともなく、好きな名前でプロジェクトを作成してください。

NuGetでCefsSharpのパッケージをインストール

ツール→NuGetパッケージマネージャ→ソリューションのNuGetパッケージの管理を選択

参照タブをクリックして、検索欄にCefSharpと入力する。
ここから現時点で最新のバージョンで進めていくけど、.NET Frameworkとかのバージョンによって色々変えないといけないのかな?
バージョン依存はありそうだけど、今回は最新で。

インストールが終わったら一度Visual Studioを閉じるとのこと。
Visual Studioの再起動でCefSharpをこのソリューションに馴染ませる。

OutputPathがプロジェクトファイルにちゃんと反映されてないというエラーが発生

もしVisual Studioを再起動してエラーが出ている場合は念のため以下のリンクも参照してください。私の場合、プロジェクトファイルがうまく上書きされなかったためにエラーが発生していたようです。
※通常は発生しませんが念のため

プラットフォーム構成の変更

今回のテーマはAnyCPUでCefSharpを動かすというもの。
なので、X86かX64か構成が決まっているのであれば、 6. 実際に動かしてみる に飛んでください。

以下ではどうやってAnyCPUで動かすのかという点について、ちょっと調査してみた。

CefSharpバージョン51以降

どうやら、CefSharpバージョン51以降ならAnyCPU対応しているようだ。
それ以前だとエラーが発生する。つまり、AnyCPUが実質使えなかったのだろう。
っというわけで、CefSharpがバージョン51以降という前提で説明していく。
色々読んでいると、単純にパッケージをインストールして、コード書いて使えるというわけではなさそう。
以下3ステップ必要なので、説明しながら手を動かした。

プロジェクトで[32ビットを選ぶ]オプションを有効にする。

プロジェクトファイルのタグを直に修正する。

<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>をPropertyGroupタグの中に追加する。

プロジェクトファイルをテキストエディタなりで開く。
以下のように追加する。

App.configファイルを変更

以下を追加する。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="x86"/>
    </assemblyBinding>
</runtime>

実際に動かしてみる

usingの設定

using CefSharp;
using CefSharp.WinForms;

全体のコードは以下。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace WinFormsCefSharpSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeChromium();
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cef.Shutdown();
        }

        public ChromiumWebBrowser chromeBrowser;
        public void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            // Initialize cef with the provided settings
            Cef.Initialize(settings);
            // Create a browser component
            chromeBrowser = new ChromiumWebBrowser("https://takumi-oda.com/blog/");
            // Add it to the form and fill it to the form window.
            this.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;
        }
    }
}

F5でデバッグ実行してみる

上記スクリーンショットで黒い枠が出ていますが、このような黒い枠が出た場合は以下の方法を試してください。

ちなみに、AnyCPUではなく、X64でビルドしたらエラーが発生する

ちょっと気になったので、念のため実験。
上記設定で色々AnyCPU周りの設定をしたので。
上記AnyCPU用の三ステップをしなければ、X64で通るはず。

配布先で注意すべきこと

これたぶんハマることになると思いますが、配布先でなぜかCefSharpが立ち上がってこないことがある。
先に原因から言うと、CefSharp自体が依存しているモジュールが不足していることがあるからです。
何が不足しているかというと、 Microsoft Visual C++ 再頒布可能パッケージです。
っで、開発環境では普通そのモジュールがあるので発生しませんが、実際の配布先では、それがことがあります。
以下のようなエラーが出た場合、十中八九それが原因と思っていいと思います。

System.IO.FileNotFoundException: Could not load file or assembly 'CefSharp.Core.dll' or one of its dependencies.

上記のようなエラーが出た場合は、以下サイトからパッケージを端末にインストールしましょう。

https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads

もう一つ、解消方法があるので以下の記事を参考にしてください。

C#C#, CefSharp

Posted by takumioda