ブログ

割とコンピュータよりの情報をお届けします。

2018年6月16日

CefSharpでAnyCPU対応に苦慮した話3

WPFでもCefSharp使えるのではと試行錯誤した挙句,いろいろとはまった

NuGetでCefSharp.Wpfをインストールして。参考ページのように以下を追加してみる。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var browser = new CefSharp.Wpf.ChromiumWebBrowser();
        browser.Address = "https://google.co.jp";
        Content = browser;
    }
}

まあ,このコードはうまくはいかない。ソリューションプラットフォームをAny CPUにしているからかも。

と言うことでまた,例の手順の登場。
*.csprojファイルの最初のProperyGroupの末尾(</PropertyGroup>の前あたり)に

<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>

を追加してVisual Studioを再起動した。

さらに,別の参考ページでWPFアプリケーションのMainを編集する方法を確認する。
App.xamlをソリューション エクスプローラーで選択しておいて,プロパティのビルドアクションをPageに変更する。
この状態でApp.xaml.csに編集を加える。

例えば次のように変更を加える。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Reflection;
using System.IO;
using CefSharp;
using CefSharp.Wpf;

namespace WPFwebui
{
    /// 
    /// App.xaml の相互作用ロジック
    /// 
    public partial class App : Application
    {
        [STAThread]
        public static void Main()
        {
            AppDomain.CurrentDomain.AssemblyResolve += Resolver;
            InitializeChromium();

            App app = new App();
            app.InitializeComponent();
            app.Run();
        }

        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;
        }

        private static void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            settings.BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
                                                   Environment.Is64BitProcess ? "x64" : "x86",
                                                   "CefSharp.BrowserSubprocess.exe");
            Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
        }
    }
}

一応動いた?

≫ 続きを読む

2018/06/16 コンピュータ   TakeMe