C#:webBrowserコントロールの代替にChromiumベースのコントロールを使う
webBrowserコントロールの終焉
WPFは使ったことがないので、Windows Formに限った話です。
C#に同梱されているwebBrowserコントロールは、ベースがIE7です。Windowsのレジストリを変更することで、IE11をエミュレートすることはできますが、最近はIE11でさえ対象ブラウザから切り捨てられています。
そのため、最新のCSS、javascriptを使ったページでは、表示や動作に問題が出ます。
Chromiumベースのコントロール
Chromiumは、Google Chromeのオープンソース版であり、あのMicrosoft社でさえ、次期Microsoft Edgeは、Chromiumベースにすると表明しています(Microsoft EdgeでYoutubeを表示すると遅くなったりなど、意地悪されたらしい--噂--)。
本家のMicrosoft社からも、新しいBrowserコントロールのお知らせもあります。
また、Microsoft EdgeベースのwebBrowserコントロールもありますが、配布先がWindows10 1803以降でないと動作しないため、それ以前のWindowsだと使えません。
現時点(2019/07/23)で現実的な解は、ChromiumベースのwebBrowserコントロールであると考えています。Windows Form用、WPF用ともに用意されていますし、nugetパッケージで配布されているため、導入も簡単です。
cefSharpのインストール
まずは、新規プロジェクトを作成し、「nugetパッケージの管理」から以下をインストールします。
上記をインストールすることで、32bit用、64bit用ともがインストールされます。
32bit/64bit CPUに対応させる
cefSharp 51からは、32bit/64bitのどちらのWindowsに対しても、読み込むchrmiunを変更することで対処できるようになりました。
ただ、そのためには、
一度プロジェクトを閉じ、プロジェクトフォルダ/プロジェクト名.csprojに以下を追加します。
最初の<PropertyGroup>の最後に
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
を追加します。
cefSharpブラウザコントロールの初期化
プログラム開始時に、32/64bitを判断し読み込むバイナリーのパスを指定します。アプリケーションの開始は、Form1の表示となります。
static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { //2重起動をチェック //Mutexクラスの作成 Mutex mutex = new Mutex(false, "AppName"); //ミューテックスの所有権を要求する if (mutex.WaitOne(0, false) == false) { //すでに起動していると判断して終了 MessageBox.Show("多重起動はできません。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); AppDomain.CurrentDomain.AssemblyResolve += Resolver; LoadApp(); //ミューテックスを解放する mutex.ReleaseMutex(); } [MethodImpl(MethodImplOptions.NoInlining)] private static void LoadApp() { var settings = new CefSettings(); // Set BrowserSubProcessPath based on app bitness at runtime settings.BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, Environment.Is64BitProcess ? "x64" : "x86", "CefSharp.BrowserSubprocess.exe"); // Make sure your set performDependencyCheck false Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null); Application.Run(new Form1()); } // Will attempt to load missing assembly from either x86 or x64 private static Assembly Resolver(object sender, ResolveEventArgs args) { if (args.Name.StartsWith("CefSharp")) { string assemblyName = args.Name.Split(new[] {','}, 2)[0] + ".dll"; string archSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, Environment.Is64BitProcess ? "x64" : "x86", assemblyName); return File.Exists(archSpecificPath) ? Assembly.LoadFile(archSpecificPath) : null; } return null; } }
Form1表示
Form1を表示する際に、FormにcefSharpブラウザコントロールを追加し最大化。その後、Yahoo!Japanのトップページを表示します。
public partial class Form1 : Form { private ChromiumWebBrowser _chromeBrowser; public Form1() { InitializeComponent(); InitializeChromium(); } public void InitializeChromium() { _chromeBrowser = new ChromiumWebBrowser("https://www.yahoo.co.jp/"); this.Controls.Add(_chromeBrowser); _chromeBrowser.Dock = DockStyle.Fill; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Cef.Shutdown(); } }