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ファイルを変更
以下を追加する。
<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
もう一つ、解消方法があるので以下の記事を参考にしてください。
ディスカッション
コメント一覧
まだ、コメントがありません