Internet ExplorerベースのWPF Webブラウザコントロールには、いくつかの キーボードとフォーカスの問題 と メモリリークの問題 があります。これらの問題に対する別の解決策として、HTML編集を基にしたWPF/C#プロジェクトでWebBrowserコントロールの代わりにChromiumをホストするための利用可能なオプションを検討しています。似たような質問が以前からありました 尋ねられた 。私は答えを読み、私自身の研究をしました、しかし、実際に生産品質のプロジェクトで以下のオプションのうちのどれかを使った人々からもう少しフィードバックを得たいと思います:
それは非常に適切に見えますが、プロジェクトがオープンソースではなく、完全なソースが容易に入手できないという事実は好きではありません。また、オフスクリーンレンダリングは私たちが本当に頼っているものではないので、これは私たちのプロジェクトにとってやり過ぎるかもしれません。
Chromium Embedded Framework(CEF) と CEFの.NETバインディング
これはおそらく現在利用可能な最良の選択肢です。このプロジェクトは、現在Chrome v27と同期しており、活気があり活発に行われているようです。 CEF3はChromeのマルチプロセスアーキテクチャを使用しています。アドビがそれを与えているようにも見えます ある程度の支持 。
当初の目的はIEおよびFirefox用のHTML5プラグインであることでしたが、実際にはスタンドアロンのActiveXコントロールとしても機能するので、WPFで使用するためにラップすることもできます。内部のWebページとの対話のために 十分なAPI を公開します(onmessage, addEventListener/removeEventListener, postMessage
)。私はGoogleが 廃止 Chrome Frameにすることを承知しています、しかし私はソースがChromiumリポジトリに残ると思います。それを最新のChromiumコードで更新することは難しくないはずです、そして私たちはこれを完全に制御するでしょう。
厳密にはChromiumベースではなく、V8エンジンを使用していないので、実際にはオプションではありません。
私が見落としたかもしれない他のオプションはありますか?
実生活でプロダクション品質のWPFプロジェクトのために、誰かが自分の経験を上記のいずれかのオプションと共有してくれたら幸いです。統合、ライセンス、または展開に何らかの影響がありましたか?ありがとうございます
[編集]この質問に多額の賞与を提供することで助成を得たことにも感謝したいと思います artlung 。
Chromiumを埋め込むための最も注目すべきソリューション(CEF、Chrome Frame、Awesomium)は既にリストしました。重要なプロジェクトはこれ以上ありません。
まだ Berkelium プロジェクト( Berkelium Sharp と Berkelium Managed を参照)がありますが、古いバージョンのChromiumに対応しています。
CEF があなたの最善の策です - それは完全にオープンソースで頻繁に更新されます。 Chromiumの最新バージョンを埋め込むことができる唯一のオプションです。 Per LundbergがCEF 3を CefSharp に移植することに積極的に取り組んでいる今、これは将来のための最良の選択肢です。 Xilium.CefGlue もありますが、これはCEF用の低レベルAPIを提供し、CEFのC APIにバインドします。一方、CefSharpはCEFのC++ APIにバインドします。
アドビが唯一のCEFを使用している主要なプレーヤーではありません、 CEFウィキペディアのページ でCEFを使用している他の注目すべきアプリケーションを見てください。
プロジェクトが 引退 されているため、更新 Chrome Frame は無意味です。
私たちはしばらく前に全く同じ挑戦をしました。 WPFベースで.NET 3.5をサポートするCEF3オープンソースライブラリを使いたかったのです。
最初に、CEFの作者自身が異なる言語へのバインディングをリストアップしました ここ 。
次に、 Xilium.CefGlue と呼ばれるオープンソースの.NET CEF3バインディングを使用して成功しました。期待通りに動作しない場合、作者は通常ビルドインで開かれた問題に非常に敏感に反応します bitbucket tracker
これまでのところ、それは私たちによく役立っています。著者は最新のCEF3リリースと定期的なバグ修正をサポートするために彼のライブラリを更新します。
これは別のものです:
http://www.essentialobjects.com/Products/WebBrowser/Default.aspx
これも最新のChromeエンジンに基づいていますが、CEFよりもずっと使いやすいです。それはあなたが単に参照して使用することができる単一の.NET DLLです。
私が所属するチームによって開発された DotNetBrowser ライブラリを見てください。 ChromiumベースのWPFおよびWinFormsブラウザコントロールを提供します。これらは.NETアプリケーションに埋め込むのが非常に簡単です。 HTML5、CSS3、JavaScriptなど、最新のWeb標準をすべてサポートしています。レンダリングされたページは、Google Chromeの場合とまったく同じです。
このライブラリはChromiumのマルチプロセスアーキテクチャを継承しています - 各Webページは別々のChromiumプロセスでレンダリングされ、プラグインのクラッシュやその他の予期しないエラーがWebページで発生した後もアプリケーションは機能し続けます。
DotNetBrowserが提供するその他の便利な機能は次のとおりです。イベントの読み込み、ネットワークアクティビティの処理、プロキシの設定、ユーザーの操作のシミュレーション、Cookieの操作、DOMへのアクセスと変更、DOMイベントの監視、.NETからのJavaScriptの呼び出しが可能逆に、WebページでWebカメラとマイクを使用し、WebRTCベースの通信を設定します。そして more 。
詳しくは APIリファレンス をご覧ください。
以下のコードスニペットは、BrowserViewを作成し、それをフォームに埋め込み、URLを読み込む方法を示しています。
using System.Windows.Forms;
using DotNetBrowser;
using DotNetBrowser.WinForms;
namespace WinForms.DotNetBrowser
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
BrowserView browserView = new WinFormsBrowserView();
Controls.Add((Control) browserView);
browserView.Browser.LoadURL("http://www.youtube.com");
}
}
}
上記の例を実行すると、次のような出力が得られます。
図書館は商業的です。商用ライセンスには、さまざまなチームサイズ用のサポートパッケージが含まれています。図書館のソースコードを購入することも可能です。
独自のページの他に、コンポーネントは、Visual Studio Marketplaceでは NuGetパッケージ および VSIXパッケージ として使用できます。
私はAwesomium.NETを使用しました。私はそれがオープンソースではないという事実、そしてそれがかなり古いWebkitレンダリングエンジンを使っているという事実も好きではありませんが、それは本当に使いやすいです。それは私がそれを与えることができる唯一の支持についてです。
私は私のWPF RSSリーダーと同じ問題を抱えていました、私はもともとAwesomiumと一緒に行きました(私はバージョン1.6だと思います)Awesomiumは素晴らしいです。あなたは、キャッシング(画像とHTMLコンテンツ)、JavaScriptの実行、ダウンロードの傍受などについて多くのコントロールを得ることができます。それはまた超高速です。プロセスの分離は、ブラウザがクラッシュしてもアプリがクラッシュしないことを意味します。
しかし、それはまた重く、リリースビルドでも10〜15mb(正確な数を覚えていることはできません)を加えます、そしてそれ故にわずかなスタートアップペナルティ。私が気付いたのは、IEブラウザコントロールに関する唯一の問題は、JavaScriptエラーが時々繰り返されるということです。しかし、それは以下のスニペットで修正されました。
私は自分のアプリをXPやVistaで使うことはほとんどありませんでしたが、Win 7以降ではクラッシュしませんでした(少なくともIEブラウザ制御を使ったからではありません)。
IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != null)
{
IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");
webBrowser;
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
if (webBrowser != null)
{
webBrowser.GetType().InvokeMember("Silent",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
}
}