WinFormsでCefSharpをAnyCPU構成で使う方法
今回も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ファイルを変更
以下を追加する。
1 2 3 4 5 | <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="x86"/> </assemblyBinding> </runtime> |

実際に動かしてみる
usingの設定
1 2 | using CefSharp; using CefSharp.WinForms; |
全体のコードは以下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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 // 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++ 再頒布可能パッケージです。
っで、開発環境では普通そのモジュールがあるので発生しませんが、実際の配布先では、それがことがあります。
以下のようなエラーが出た場合、十中八九それが原因と思っていいと思います。
1 | 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
もう一つ、解消方法があるので以下の記事を参考にしてください。
ディスカッション
コメント一覧
まだ、コメントがありません