Existe-t-il un moyen relativement simple d'insérer un navigateur moderne dans une application .NET?
Autant que je sache, le contrôle WebBrowser
est un wrapper pour C'EST-À-DIRE, ce qui ne poserait pas de problème sauf qu'il semble comme une version très ancienne de C'EST-À-DIRE, avec tout ce que cela implique en termes de bricolage CSS, de risques de sécurité potentiels (si le moteur de rendu n’a pas été corrigé, puis-je vraiment espérer que les zillions débordements de mémoire tampon soient résolus?) et d’autres problèmes.
J'utilise Visual Studio C # (édition rapide - cela fait-il une différence?)
J'aimerais intégrer un bon navigateur Web dans mes applications. Dans certains cas, je ne l'utilise que pour gérer le processus d'enregistrement des utilisateurs, l'interface avec certaines fonctionnalités de mon site Web et d'autres éléments de cet ordre, mais j'ai une autre application en tête qui nécessitera plus de contrôle ... err.
J'ai besoin:
Je pensais à Chrome, car il est sous licence BSD, mais je serais tout aussi heureux d’une version récente d’IE.
Dans la mesure du possible, j'aimerais que les choses restent simples. Le mieux serait de pouvoir appliquer le contrôle WebBrowser
existant, qui gère déjà environ 70% de ce dont j'ai besoin, mais je ne pense pas que ce soit possible.
J'ai trouvé un contrôle ActiveX pour Mozilla ( http://www.iol.ie/~locka/mozilla/control.htm ), mais il semble que ce soit une ancienne version, donc ce n'est pas nécessairement une amélioration .
Je suis ouvert aux suggestions
Checkout CefSharp . Liaisons Net , un projet que j'ai lancé il y a bien longtemps et qui, heureusement, a été repris par le communauté et transformé en quelque chose de merveilleux.
Le projet englobe le Chromium Embedded Framework et a été utilisé dans un certain nombre de projets majeurs, notamment le client Windows de Rdio, Facebook Messenger pour Windows et Github pour Windows.
Il comporte des commandes de navigateur pour WPF et Winforms et comporte des tonnes de fonctionnalités et de points d'extension. Étant basé sur le chrome, il est extrêmement rapide.
Prenez-le à partir de NuGet: Install-Package CefSharp.Wpf
ou Install-Package CefSharp.WinForms
Découvrez des exemples et donnez votre opinion/feedback/demandes-pull: https://github.com/cefsharp/CefSharp
sous licence BSD
Si vous ne le saviez pas, Chrome utilise (un fork de) Webkit, également utilisé par Safari. Voici quelques questions qui vont dans le même sens:
La version Webkit n’est pas excellente, contrairement à l’autre réponse: une version ne fonctionne plus (la version google code) et la version Mono est expérimentale. Ce serait bien si quelqu'un faisait l'effort de créer un wrapper .NET digne de ce nom mais ce n'est pas quelque chose que personne ne semble vouloir faire. ) moteur manque.
Mise à jour (2014)
Un nouveau projet à double licence vous permet d'intégrer Chrome dans vos applications .NET appelées Awesomium . Il est livré avec une API .NET mais nécessite pas mal de bidouilles pour le rendu (les exemples dessinent la fenêtre du navigateur dans un tampon, peignent le tampon en tant qu’image et actualisent le temps).
I pense c'est le navigateur utilisé par Origin dans Battlefield 3.
Mise à jour (2016)
Il existe maintenant DotnetBrowser , une alternative commerciale à Awesomium. Il est basé sur le chrome.
Je teste des alternatives au composant de navigateur Web C # depuis quelques jours et voici ma liste:
1. Utiliser les nouvelles IE versions 8,9:
composant du navigateur Web est IE7 pas IE8? Comment changer cela?
Avantages:
Les inconvénients:
Cela ne nécessite pas beaucoup de travail et vous pouvez obtenir un support HTML5 et CSS3 bien que IE9 manque de certaines des meilleures fonctionnalités CSS3 et HTML5. Mais je suis sûr que IE10 pourrait fonctionner de la même manière. Le problème serait que le système cible devrait avoir installé IE10 et, étant donné qu'il est toujours en aperçu sur Windows 7, je le déconseillerais.
OpenWebKitSharp est un wrapper .net pour le moteur de kit Web basé sur le projet WebKit.NET 0.5. WebKit est un moteur de mise en page utilisé par Chrome/Safari
Avantages:
Les inconvénients:
OpenWebKit est plutôt agréable, bien que de nombreuses fonctionnalités ne soient pas encore implémentées. J'ai rencontré peu de problèmes lorsque je l’utilisais avec Visual Studio, qui jette ici une référence d’objet null, puis en mode conception, il y a quelques problèmes avec js. Tous ceux qui l'utiliseront remarqueront presque immédiatement que js alert ne fait rien. Des événements tels que mouseup, mousedown, etc. ne fonctionnent pas, js drag and drop est buggy, etc.
J'ai également eu quelques difficultés à l'installer car il nécessite une version spécifique de VC redistribuable installé. Ainsi, après exception, j'ai consulté le journal des événements, j'ai trouvé la version de VC et je l'ai installé.
3. GeckoFX
Avantages:
Les inconvénients:
GeckoFX est un contrôle multiplate-forme de Webrowser destiné à être intégré à des applications WinForms. Ceci peut être utilisé avec .NET sous Windows et mono sous Linux. Gecko est un moteur de mise en page utilisé par Firefox.
Je suis tombé sur peu d'informations indiquant que GeckoFX n'est pas développé de manière active, ce qui n'est pas vrai. Bien sûr, il y a toujours une ou deux versions de Firefox, mais c'est normal, j'ai été vraiment impressionné par l'activité et le contrôle lui-même. Il fait tout ce dont j'avais besoin, mais j'avais besoin d'un peu de temps pour le faire fonctionner, voici un petit tutoriel pour le faire fonctionner:
Si vous devez vraiment utiliser Chrome, jetez un oeil à ce produit appelé Awesomium , il est gratuit pour les projets non commerciaux, mais la licence est de quelques milliers de dollars pour les commerciaux.
J'ai eu le même problème, le WebBrowser utilisait une ancienne version d'IE, avec un peu de googler, je suis tombé sur le code suivant qui modifie le registre et permet au WebBrowser d'utiliser la dernière version IE possible:
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;
}
}
Il vous suffit de créer une classe et d'y insérer ce code, puis d'exécuter le code suivant au démarrage du programme:
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
Vous pouvez l'utiliser comme:
If Not WBEmulator.IsBrowserEmulationSet() Then
WBEmulator.SetBrowserEmulationVersion()
End If
Vous pouvez utiliser la base de registres pour définir IE version pour le contrôle du navigateur Web. Accédez à: HKLM\LOGICIEL\Microsoft\Internet Explorer\Principal\FeatureControl\FEATURE_BROWSER_EMULATION et ajoutez "yourApplicationName.exe" avec la valeur de browser_emulation. Pour connaître la valeur de browser_emulation, reportez-vous au lien suivant: http://msdn.Microsoft.com /en-us/library/ee330730%28VS.85%29.aspx#browser_emulation
Jetez un coup d’œil au contrôle Mono.WebBrowser - il intègre soit Gecko (utilisé par Firefox), soit WebKit (utilisé par Safari) dans WinForms (sans utiliser ActiveX).
Je sais que ce n'est pas un contrôle WebBrowser "de remplacement", mais je rencontrais des problèmes de rendu épouvantables lorsque je montrais une page qui utilisait BootStrap 3+ pour la présentation, etc. le suivant. Apparemment, il est spécifique à IE et lui dit d’utiliser la dernière variante trouvée sur la machine cliente pour le rendu (donc elle n’utilisera pas IE7 car j’estime par défaut)
Donc, il suffit de mettre:
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
quelque part dans la partie principale de votre document.
Si, bien sûr, ce n'est pas votre document, cela ne vous aidera évidemment pas (bien que je considère personnellement que c'est un trou dans la sécurité si vous lisez des pages que vous n'avez pas créées par le biais du contrôle du navigateur Web - pourquoi ne pas utiliser simplement un navigateur Web!)
Bonne chance.
Jetez un coup d'œil à la bibliothèque DotNetBrowser . Il fournit des contrôles de navigateur WPF et WinForms basés sur Chromium, qui sont assez faciles à intégrer dans une application .NET. Il prend en charge toutes les normes Web modernes, y compris HTML5, CSS3 et JavaScript. La page rendue ressemble exactement à celle de Google Chrome.
La bibliothèque hérite de l'architecture multi-processus de Chromium - chaque page Web est rendue dans un processus Chromium distinct et l'application continue de fonctionner même après la panne du plug-in ou toute autre erreur inattendue sur la page Web.
DotNetBrowser fournit d’autres fonctionnalités utiles: il est possible d’écouter des événements de charge, de gérer l’activité du réseau, de configurer un proxy, de simuler les actions de l’utilisateur, de travailler avec des cookies, d’accéder et de modifier DOM, d’écouter des événements DOM, d’appeler JavaScript depuis .NET. et inversement, utilisez la caméra Web et le microphone sur la page Web, configurez la communication WebRTC et plus .
Consultez le Référence de l'API pour plus de détails.
L'extrait de code ci-dessous montre comment créer un BrowserView, l'intégrer à un formulaire et charger une 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");
}
}
}
Une fois que vous avez exécuté l'exemple ci-dessus, vous obtiendrez le résultat suivant:
La bibliothèque est commerciale. Les licences commerciales incluent des packages de support pour différentes tailles d’équipes. Il est également possible d’acheter le code source de la bibliothèque.
Outre sa propre page, le composant est disponible sous la forme package NuGet et package VSIX dans Visual Studio Marketplace.
J'ai essayé une poignée de variantes de Webkit, mais d'après mon expérience, rien ne vaut les progrès réalisés par OpenWebkitSharp . J'adore j'adore… Les partitions HTML5 et CSS3 sont aussi proches que possible de Google Chrome. Très belle API et modèle de concours complet. Si vous trouvez des API "non implémentées", probablement parce qu'elles ne sont pas implémentées dans Webkit. Tout le reste fonctionne très bien.
OpenWebKitSharp est un wrapper .net pour le moteur de kit Web basé sur le projet WebKit.NET 0.5. Il ajoute plus de fonctionnalités à la version 0.5 et fournit plus de méthodes que cette version. OpenWebKitSharp prend en charge les versions Cairo (0.5) et nocturnes de Webkit (Nightly par défaut). Dans la version 1.5, Stable et plus, la construction nocturne est incluse et automatiquement copiée après la construction. Dans les versions antérieures, cela se produisait avec la version cairo. OpenWebKitSharp est actuellement associé à GTLite Navigator, un navigateur Web rapide, stable et flexible.
Essayez EO.WebBrowser . Il est nouveau et basé sur la dernière version du navigateur Chrome. La meilleure partie de ce logiciel réside dans le fait qu’il intègre tout dans une seule DLL .NET, ce qui lui confère non seulement une grande facilité d’utilisation et de déploiement, mais aussi le même DLL, qui prend en charge les versions 32 bits et 64 bits, car il s’agit d’un fichier .NET. dll.
MISE À JOUR 2018 MAI
Si vous ciblez une application sur Windows 10, vous pouvez maintenant intégrer le navigateur Edge à votre application .net à l'aide de Windows Community Toolkit .
Exemple WPF:
1) Installer le package de nuget de Windows Community Toolkit
Install-Package Microsoft.Toolkit.Win32.UI.Controls
2) Code 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) Code 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"));
}
}
Exemple 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"));
}
}
Veuillez vous référer à ceci lien pour plus d'informations.
J'ai utilisé GeckoFX et cela me sert très bien. Il utilise le moteur Firefox. La seule mise en garde que j’ai jamais rencontrée, c’est qu’il émettait l’événement "DocumentLoaded" une fois avant que le document ne soit réellement chargé ... des images et des trucs sont chargés. Je l'ai corrigé en ignorant simplement le premier, et cela a fonctionné à merveille jusqu'à présent.
Vous pouvez le trouver ici: https://bitbucket.org/geckofx/
Comme la plupart des bibliothèques décentes, il est open source.
MozNet est un contrôle .NET, basé auparavant sur le contrôle plus ou moins abandonné de GeckoFX, mais il est en plein développement et comporte bien plus de fonctionnalités que ce que GeckoFX ne peut vanter. Vous pouvez le trouver sur le site Se7en Soft .
Mise à jour 2016:
Il y a 3 options supplémentaires que je peux suggérer:
Un composant .Net qui peut être utilisé pour intégrer le moteur Chrome dans votre application .Net. Basé sur CefGlue mais un peu plus rapidement sur les mises à jour de la dernière version de Chrome. Il existe également une option de support commercial qui pourrait s'avérer utile pour certains. Bien sûr, le composant lui-même est open source .
Un autre composant .Net qui peut être utilisé pour intégrer le moteur de Firefox dans votre application .Net. Ceci est basé sur Geckofx mais contrairement à la version actuelle de Geckofx, cela fonctionnera avec une version normale de Firefox. Pour utiliser Geckofx, vous devrez créer Firefox vous-même. Encore une fois , le support commercial est disponible mais le composant lui-même est entièrement open source .
Vous avez besoin de tous les navigateurs de votre application .Net? Avec laquelle l’API BrowseEmAll Core, vous pouvez intégrer Chrome, Firefox, Webkit et Internet Explorer dans votre application. Ceci est un produit commercial mais soyez prévenu.
(divulgation complète: je travaille pour cette entreprise, alors prenez tout ce que je dis avec un grain de sel)
EO.BrowserControl est rapide et facile. Il a le moteur de navigateur Chrome et fonctionne avec toutes les versions de .NET
https://visualstudiogallery.msdn.Microsoft.com/fcee0646-42e7-484f-b22e-f8b2ace55dd7
Remarque: il s’agit d’un produit sous licence commerciale et je n’en fais pas la promotion dans cet esprit. Après avoir essayé diverses autres choses, j'ai finalement choisi ceci.
Geckofx et Webkit.net étaient tous les deux prometteurs au début, mais ils ne se tenaient pas au courant avec Firefox et respectivement Chrome tandis qu'Internet Explorer s'améliorait, de même que le contrôle Webbrowser, bien qu'il se comporte comme IE7 par défaut quelle que soit votre version de IE, mais vous pouvez corriger cela en allant dans le registre et en le changeant en IE9, autorisant HTML5.
Si vous recherchez un contrôle basé sur Nice IE - consultez: http://code.google.com/p/csexwb2/
Je l'ai utilisé dans des produits de production. C'est assez bon et il y a de bonnes démos bien que cela ne semble pas être maintenu aussi bien qu'avant.
Découvrez le contrôle GeckoFX .
Mise à jour 2016:
Pour moi, la seule alternative de navigateur fiable et maintenue à IE est EO.WebBrowser. J'ai passé des jours et des semaines à essayer les autres. Tous avaient des problèmes qui ont arrêté la série pour moi à un moment donné.
J'ai essayé tous les navigateurs existants. Malheureusement, le seul qui a vraiment fonctionné pour moi dans toutes les circonstances a été EO.Browser. J'aurais aimé pouvoir choisir une solution gratuite, mais je me suis retrouvé avec EO.Browser. C'est assez cher, mais bien entretenu.