最新のブラウザを.NETアプリケーションに挿入するための比較的簡単な方法はありますか?
私が理解している限りでは、WebBrowser
コントロールはIEのラッパーですが、これはIEの非常に古いバージョンであることを除けば問題にはなりません。それはCSSのねじ込み、潜在的なセキュリティリスク(レンダリングエンジンにパッチが適用されていない場合、本当に無数のバッファオーバーフローの問題が修正されることを期待できますか?)、およびその他の問題を伴います。
Visual Studio C#(エクスプレス版 - ここで何か違いがありますか?)を使用しています
私は自分のアプリケーションに優れたWebブラウザを統合したいと思います。場合によっては、ユーザー登録プロセス、私のWebサイトの機能の一部やその順序の他のものとのインターフェースを処理するためにそれを使用するだけですが、もっと誤った制御を必要とする別のアプリケーションがあります。
私は欲しい:
BSDライセンスの下にあるので、私はChromeについて考えていました、しかし私はIEの最近のバージョンと同じくらい幸せになるでしょう。
可能な限り、物事をシンプルにしたいと思います。既存のWebBrowser
コントロールにパッチをあてることができれば最善の方法です。これはすでに必要なものの約70%を占めていますが、それは不可能だと思います。
私はMozilla用のactiveXコントロール( http://www.iol.ie/~locka/mozilla/control.htm )を見つけましたが、それは古いバージョンのように見えます、それでそれは必ずしも改良ではありません。
私は提案を受け入れています
Checkout CefSharp .Netバインディング、私がしばらく前に始めたプロジェクトがコミュニティに拾われ、素晴らしいものに変わった。
このプロジェクトはChromium Embedded Frameworkをラップしており、RdioのWindowsクライアント、Windows用のFacebookメッセンジャー、Windows用のGithubを含む多くの主要プロジェクトで使用されています。
それはWPFとWinformsのためのブラウザコントロールを特徴とし、たくさんの機能と拡張ポイントを持っています。 Chromiumをベースにしているので、それも膨れ上がります。
NuGetから入手してください:Install-Package CefSharp.Wpf
またはInstall-Package CefSharp.WinForms
例をチェックして、あなたの考え/フィードバック/ pull-requestを与えてください: https://github.com/cefsharp/CefSharp
BSDライセンス
知らない場合、ChromeはWebkit(のフォーク)を使用します。これはSafariでも使用されています。これは同じことであるいくつかの質問です。
Webkitのものは他の答えが述べるように素晴らしいものではなく、1つのバージョンはもはや機能しません(Googleコードのもの)そしてMonoのものは実験的です。誰かがまともな.NETラッパーを作ろうと努力したとしても、それは誰もが望んでいることではないというのはいいことです。 )エンジンが不足している。
更新(2014)
Awesomium と呼ばれる.NETアプリケーションにChromeを埋め込むことを可能にする新しいデュアルライセンスプロジェクトがあります。 .NET APIが付属していますが、レンダリングにはかなりの数のハックが必要です(例ではブラウザウィンドウをバッファに描画し、バッファを画像としてペイントしてタイマーで更新します)。
I thinkこれはBattlefield 3のOriginで使われているブラウザです。
更新(2016)
DotnetBrowser 、Awesomiumの商業的な代替品があります。 Chromiumをベースにしています。
私は数日前からC#Webブラウザコンポーネントの代替品をテストしてきました。これが私のリストです。
1.新しいIEバージョン8,9を使用:
WebブラウザコンポーネントはIE7ではなくIE7ですか?これを変更する方法?
長所:
短所:
これは多くの作業を必要とせず、IE9はいくつかの最高のCSS3とHTML5機能を欠いていますが、あなたはいくらかのHTML5とCSS3サポートを得ることができます。しかし、私はあなたがIE10を同じように走らせることができると確信しています。問題は、ターゲットシステムにIE10がインストールされていなければならないことであり、それ以来、Windows 7でプレビュー中であるので、私はそれに対して提案するでしょう。
OpenWebKitSharpは、WebKit.NET 0.5プロジェクトに基づくWebキットエンジン用の.netラッパーです。 WebKitはChrome/Safariで使われているレイアウトエンジンです。
長所:
短所:
OpenWebKitは非常に素晴らしいですが、多くの機能はまだ実装されていませんが、ここでnullオブジェクト参照をスローするビジュアルスタジオでそれを使用すると、いくつかの問題が発生します。それを使っている人はほとんどすぐにjs alertが何もしないことに気づくでしょう。 mouseup、mousedownなどのイベントは機能しません。jsドラッグアンドドロップはバグがあります。
特定のバージョンのVC再配布可能な再インストールが必要なため、インストールに問題がありました。例外が発生した後、イベントログを調べて、バージョンのVCを見つけてインストールしました。
3. GeckoFX
長所:
短所:
GeckoFXは、WinFormsアプリケーションに埋め込むためのクロスプラットフォームのWebブラウザコントロールです。これは、Windowsでは.NET、Linuxではmonoで使用できます。 GeckoはFirefoxで使用されているレイアウトエンジンです。
私はGeckoFXが活発に開発されていないという事実に遭遇することはほとんどありませんでした。もちろん、Firefoxの1、2バージョンの背後にはありますが、それは通常のことです。それは私が必要とするすべてをします、しかし私はそれを実行するためにいくらかの時間を必要としました、これを実行するためのちょっとしたチュートリアルはここにあります:
あなたが本当にChromeを使わなければならないなら、 Awesomium と呼ばれるこの製品を見てください。それは非営利的なプロジェクトのために無料ですが、ライセンスはコマーシャルのために数千ドルです。
私は同じ問題を抱えていました。WebBrowserは古いバージョンのIEを使用していました。レジストリを変更し、lastest IEバージョンを使用することを可能にする次のコードに出会いました。
public enum BrowserEmulationVersion
{
Default = 0,
Version7 = 7000,
Version8 = 8000,
Version8Standards = 8888,
Version9 = 9000,
Version9Standards = 9999,
Version10 = 10000,
Version10Standards = 10001,
Version11 = 11000,
Version11Edge = 11001
}
public static class WBEmulator
{
private const string InternetExplorerRootKey = @"Software\Microsoft\Internet Explorer";
public static int GetInternetExplorerMajorVersion()
{
int result;
result = 0;
try
{
RegistryKey key;
key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey);
if (key != null)
{
object value;
value = key.GetValue("svcVersion", null) ?? key.GetValue("Version", null);
if (value != null)
{
string version;
int separator;
version = value.ToString();
separator = version.IndexOf('.');
if (separator != -1)
{
int.TryParse(version.Substring(0, separator), out result);
}
}
}
}
catch (SecurityException)
{
// The user does not have the permissions required to read from the registry key.
}
catch (UnauthorizedAccessException)
{
// The user does not have the necessary registry rights.
}
return result;
}
private const string BrowserEmulationKey = InternetExplorerRootKey + @"\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
public static BrowserEmulationVersion GetBrowserEmulationVersion()
{
BrowserEmulationVersion result;
result = BrowserEmulationVersion.Default;
try
{
RegistryKey key;
key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);
if (key != null)
{
string programName;
object value;
programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
value = key.GetValue(programName, null);
if (value != null)
{
result = (BrowserEmulationVersion)Convert.ToInt32(value);
}
}
}
catch (SecurityException)
{
// The user does not have the permissions required to read from the registry key.
}
catch (UnauthorizedAccessException)
{
// The user does not have the necessary registry rights.
}
return result;
}
public static bool SetBrowserEmulationVersion(BrowserEmulationVersion browserEmulationVersion)
{
bool result;
result = false;
try
{
RegistryKey key;
key = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, true);
if (key != null)
{
string programName;
programName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
if (browserEmulationVersion != BrowserEmulationVersion.Default)
{
// if it's a valid value, update or create the value
key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
}
else
{
// otherwise, remove the existing value
key.DeleteValue(programName, false);
}
result = true;
}
}
catch (SecurityException)
{
// The user does not have the permissions required to read from the registry key.
}
catch (UnauthorizedAccessException)
{
// The user does not have the necessary registry rights.
}
return result;
}
public static bool SetBrowserEmulationVersion()
{
int ieVersion;
BrowserEmulationVersion emulationCode;
ieVersion = GetInternetExplorerMajorVersion();
if (ieVersion >= 11)
{
emulationCode = BrowserEmulationVersion.Version11;
}
else
{
switch (ieVersion)
{
case 10:
emulationCode = BrowserEmulationVersion.Version10;
break;
case 9:
emulationCode = BrowserEmulationVersion.Version9;
break;
case 8:
emulationCode = BrowserEmulationVersion.Version8;
break;
default:
emulationCode = BrowserEmulationVersion.Version7;
break;
}
}
return SetBrowserEmulationVersion(emulationCode);
}
public static bool IsBrowserEmulationSet()
{
return GetBrowserEmulationVersion() != BrowserEmulationVersion.Default;
}
}
あなただけのクラスを作成し、その中にこのコードを入れて、そしてプログラムが起動したときに次のコードを実行する必要があります。
if (!WBEmulator.IsBrowserEmulationSet())
{
WBEmulator.SetBrowserEmulationVersion();
}
VB.NET:
Imports Microsoft.Win32
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Security
Imports System.Text
Imports System.Threading.Tasks
Public Enum BrowserEmulationVersion
[Default] = 0
Version7 = 7000
Version8 = 8000
Version8Standards = 8888
Version9 = 9000
Version9Standards = 9999
Version10 = 10000
Version10Standards = 10001
Version11 = 11000
Version11Edge = 11001
End Enum
Public Class WBEmulator
Private Const InternetExplorerRootKey As String = "Software\Microsoft\Internet Explorer"
Public Shared Function GetInternetExplorerMajorVersion() As Integer
Dim result As Integer
result = 0
Try
Dim key As RegistryKey
key = Registry.LocalMachine.OpenSubKey(InternetExplorerRootKey)
If key IsNot Nothing Then
Dim value As Object = If(key.GetValue("svcVersion", Nothing), key.GetValue("Version", Nothing))
Dim Version As String
Dim separator As Integer
Version = value.ToString()
separator = Version.IndexOf(".")
If separator <> -1 Then
Integer.TryParse(Version.Substring(0, separator), result)
End If
End If
Catch ex As SecurityException
'The user does Not have the permissions required to read from the registry key.
Catch ex As UnauthorizedAccessException
'The user does Not have the necessary registry rights.
Catch
End Try
GetInternetExplorerMajorVersion = result
End Function
Private Const BrowserEmulationKey = InternetExplorerRootKey + "\Main\FeatureControl\FEATURE_BROWSER_EMULATION"
Public Shared Function GetBrowserEmulationVersion() As BrowserEmulationVersion
Dim result As BrowserEmulationVersion
result = BrowserEmulationVersion.Default
Try
Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
If key IsNot Nothing Then
Dim programName As String
Dim value As Object
programName = Path.GetFileName(Environment.GetCommandLineArgs()(0))
value = key.GetValue(programName, Nothing)
If value IsNot Nothing Then
result = CType(Convert.ToInt32(value), BrowserEmulationVersion)
End If
End If
Catch ex As SecurityException
'The user does Not have the permissions required to read from the registry key.
Catch ex As UnauthorizedAccessException
'The user does Not have the necessary registry rights.
Catch
End Try
GetBrowserEmulationVersion = result
End Function
Public Shared Function SetBrowserEmulationVersion(BEVersion As BrowserEmulationVersion) As Boolean
Dim result As Boolean = False
Try
Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey(BrowserEmulationKey, True)
If key IsNot Nothing Then
Dim programName As String = Path.GetFileName(Environment.GetCommandLineArgs()(0))
If BEVersion <> BrowserEmulationVersion.Default Then
'if it's a valid value, update or create the value
key.SetValue(programName, CType(BEVersion, Integer), RegistryValueKind.DWord)
Else
'otherwise, remove the existing value
key.DeleteValue(programName, False)
End If
result = True
End If
Catch ex As SecurityException
' The user does Not have the permissions required to read from the registry key.
Catch ex As UnauthorizedAccessException
' The user does Not have the necessary registry rights.
End Try
SetBrowserEmulationVersion = result
End Function
Public Shared Function SetBrowserEmulationVersion() As Boolean
Dim ieVersion As Integer
Dim emulationCode As BrowserEmulationVersion
ieVersion = GetInternetExplorerMajorVersion()
If ieVersion >= 11 Then
emulationCode = BrowserEmulationVersion.Version11
Else
Select Case ieVersion
Case 10
emulationCode = BrowserEmulationVersion.Version10
Case 9
emulationCode = BrowserEmulationVersion.Version9
Case 8
emulationCode = BrowserEmulationVersion.Version8
Case Else
emulationCode = BrowserEmulationVersion.Version7
End Select
End If
SetBrowserEmulationVersion = SetBrowserEmulationVersion(emulationCode)
End Function
Public Shared Function IsBrowserEmulationSet() As Boolean
IsBrowserEmulationSet = GetBrowserEmulationVersion() <> BrowserEmulationVersion.Default
End Function
End Class
あなたはそれを使うことができます:
If Not WBEmulator.IsBrowserEmulationSet() Then
WBEmulator.SetBrowserEmulationVersion()
End If
レジストリを使用して、WebブラウザコントロールのIEバージョンを設定できます。 HKLM\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATIONに移動し、browser_emulationの値を含む "yourApplicationName.exe"を追加します。browser_emulationの値を表示するには、リンクを参照してください。 http://msdn.Microsoft.com/ ja-jp/library/ee330730%28VS.85%29.aspx#browser_emulation
Mono.WebBrowser controlを見てください - これはGecko(Firefoxで使われているように)かWebKit(Safariで使われています)のどちらかを(ActiveXを使わずに)WinFormsに埋め込みます。
私はこれが「代替」WebBrowserコントロールではないことを知っていますが、レイアウトなどにBootStrap 3+を使用しているページを表示している間にレンダリングに関するいくつかの問題を抱えていました。どうやらそれはIEに特有のもので、レンダリングにクライアントマシンにある最新のバリエーションを使うように伝えます(だから私はデフォルトだと思うのでIE7は使いません)
だからちょうど置く:
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
文書の頭のどこかにあります。
もちろんそれがあなたの文書ではない場合、これは明らかに役に立ちません(私が個人的にあなたがWebブラウザコントロールを通して作成していないページを読んでいるならそれはセキュリティホールであると思います - なぜWebブラウザを使わないだけです!)
がんばろう。
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");
}
}
}
上記の例を実行すると、次のような出力が得られます。
このライブラリは商用ですが、オープンソースプロジェクトや学術プロジェクトでは無料で利用できます。商用ライセンスには、さまざまなチームサイズ用のサポートパッケージが含まれています。図書館のソースコードを購入することも可能です。
独自のページの他に、コンポーネントは NuGetパッケージ およびVisual Studioマーケットプレースの VSIXパッケージ として使用できます。
私は一握りのWebkitの変種を試してみましたが、私の経験では OpenWebkitSharp が持っている進歩に勝るものはありません。 HTML5とCSS3のスコアは、Google Chromeと同じくらい近いです。とてもいいAPIとイベントモデル。 「実装されていない」APIがWebkitに実装されていないために発生している可能性が最も高いと思われる場合。他のものはすべてうまくいきます。
OpenWebKitSharpは、WebKit.NET 0.5プロジェクトに基づくWebキットエンジン用の.netラッパーです。それは0.5バージョンにより多くの機能を追加し、それはそのビルドよりも多くのメソッドを提供します。 OpenWebKitSharpはCairoビルド(0.5)とナイトリービルド(デフォルトではナイトリー)の両方をサポートします。バージョン1.5では安定版以上の夜間ビルドが含まれており、ビルド後に自動的にコピーされます。以前のバージョンでは、これはcairoビルドで起こります。 OpenWebKitSharpは現在、高速で安定した柔軟なWebブラウザであるGTLiteナビゲータを強化しています。
EO.WebBrowser を試してください。これは新しく、Chromeブラウザの最新バージョンに基づいています。それについての最も良い部分は、それが非常に使いやすく展開するだけでなく、同じDLLも.NETであるため、64ビットの両方をサポートするので、単一の.NET dllの中にすべてを詰めることです。 DLL。
私はGeckoFXを使用しました、そしてそれは非常によく役立ちます。 Firefoxエンジンを使用しています。私がこれまで遭遇した唯一の注意点は、それが文書が実際に完全にロードされる前に一度 "DocumentLoaded"イベントを発行するということです。画像やものがロードされます。私は最初のものを単に無視することによってそれを修正しました、そしてそれは今までのところ間違いなく美しく働いています。
あなたはそれをここで見つけることができます: https://bitbucket.org/geckofx/
他のほとんどのライブラリと同様に、オープンソースです。
更新2018年5月
Windows 10上で実行するアプリケーションをターゲットにしている場合は、 Windows Community Toolkit を使用してEdgeブラウザを.NETアプリケーションに埋め込むことができます。
WPFの例:
1)Windows Community Toolkit Nugetパッケージをインストールする
Install-Package Microsoft.Toolkit.Win32.UI.Controls
2)XAMLコード
<Window
x:Class="WebViewTest.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:WPF="clr-namespace:Microsoft.Toolkit.Win32.UI.Controls.WPF;Assembly=Microsoft.Toolkit.Win32.UI.Controls"
xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WebViewTest"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Grid>
<WPF:WebView x:Name="wvc" />
</Grid>
</Window>
3)CSコード:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// You can also use the Source property here or in the WPF designer
wvc.Navigate(new Uri("https://www.Microsoft.com"));
}
}
WinFormsの例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// You can also use the Source property here or in the designer
webView1.Navigate(new Uri("https://www.Microsoft.com"));
}
}
詳しくはこちらの{ link を参照してください。
MozNetは.NETコントロールであり、以前はほぼ放棄されたGeckoFXコントロールに基づいていましたが、完全に開発中であり、GeckoFXよりも多くの機能を備えています。あなたは Se7en Soft ウェブサイトでそれを見つけることができます。
2016年の更新:
提案できる3つの追加オプションがあります。
Chromeエンジンを.Netアプリケーションに統合するために使用できる.Netコンポーネント。 CefGlue に基づいていますが、最新のChromeバージョンへの更新では少し高速です。また、commercial supportオプションが利用可能であり、これは一部の人にとっては便利かもしれません。もちろん、コンポーネント自体はopen sourceです。
Firefox engineを.Netアプリケーションに統合するために使用できる別の.Netコンポーネント。これは Geckofx に基づいていますが、Geckofxの現在のバージョンとは異なり、これはFirefoxの通常のリリースビルドで動作します。 Geckofxを使用するには、Firefoxを自分でビルドする必要があります。再び商用サポートは利用可能ですが、コンポーネント自体は完全にオープンソースです。
.Netアプリケーションにすべての異なるブラウザーが必要ですか?どのBrowseEmAll Core APIを使用できますか?Chrome、Firefox、Webkit、Internet Explorerをアプリケーションに統合します。これは商用製品ですが、注意してください。
(完全な開示:私はこの会社で働いているので、私が言うすべてのものを一粒で取ります)
EO.BrowserControlは速くて簡単です。 Chromeブラウザエンジンを搭載しており、あらゆるバージョンの.NETで動作します。
https://visualstudiogallery.msdn.Microsoft.com/fcee0646-42e7-484f-b22e-f8b2ace55dd7
注:これは商業的に認可された製品であり、私はそれを念頭に置いてそれを推進していません。他の様々なことを試した後、私はこれを選ぶことになった。
GeckofxとWebkit.netは両方とも最初は有望でしたが、Internet Explorerが改善されたので、FirefoxとChromeの最新の状態を維持できませんでした。 IEのバージョンに関係なく、レジストリに移動してIE9に変更し、HTML5を許可することで修正できます。
あなたがNice IEベースのコントロールを探しているなら - チェックアウト: http://code.google.com/p/csexwb2/
私は製造製品でそれを使用しました。それはかなり良く、良いデモを持っていますが、今までほどうまく維持されていないようです。
GeckoFX コントロールをチェックしてください。
2016年を更新:
私にとって、IEに代わる唯一の信頼性が高く維持されているブラウザはEO.WebBrowserです。私は何日も何週間もかけて他の人たちを試しました。彼ら全員はある時点で私のためにショーを止めたいくつかの問題を抱えていた。
私はそこにあるすべてのブラウザを試しました。残念ながら、すべての状況下で私にとって本当にうまくいったのはEO.Browserだけでした。私は私が私が自由な解決策を選んだことを望みました、しかし私はEO.Browserで終わりました。それはかなり高価ですが、よく手入れされています。