用一个更好的浏览器替换。net WebBrowser控件,比如Chrome?

是否有相对简单的方法将现代浏览器插入到。net应用程序中?

据我所知,WebBrowser控件是的包装器,这不会是一个问题,除了它看起来像一个非常旧的版本,在CSS方面的所有后果,潜在的安全风险(如果渲染引擎没有打补丁,我真的能指望无数的缓冲区溢出问题得到解决吗?)和其他问题。

我正在使用Visual Studio c#(快速版-它在这里有任何区别吗?)

我想在我的应用程序中集成一个好的网络浏览器。在某些情况下,我只是用它来处理用户注册过程,界面与我的网站的一些功能和其他事情的顺序,但我有另一个应用程序在脑海中,将需要更多的错误…控制。

我需要:

  • 一个可以集成到我的应用程序的一个窗口中的浏览器(不是一个单独的窗口)
  • 对CSS, js和其他web技术的良好支持,与任何现代浏览器相当
  • 基本的浏览器功能,如“导航”、“返回”、“重载”……
  • 自由访问页面代码和输出。

我在考虑Chrome,因为它是基于BSD许可的,但我也会同样喜欢最新版本的IE。

尽可能地,我想让事情简单化。最好的情况是,如果有人可以修补现有的WebBrowser控件,它已经做了大约70%的我需要的,但我不认为这是可能的。

我已经为Mozilla (http://www.iol.ie/~locka/mozilla/control.htm)找到了一个activeX控件,但它看起来像一个旧版本,所以它不一定是一个改进。

我愿意听取建议

528795 次浏览

如果你不知道的话,Chrome使用Webkit(一个分支),Safari也使用。下面是一些类似的问题:

webkit并不像另一个答案所说的那样好,一个版本不再工作(谷歌代码版本),Mono版本是实验性的。如果有人努力为它做一个像样的。net包装就好了,但似乎没有人想这么做——考虑到它现在支持HTML5和许多IE(8)引擎所缺乏的其他特性,这是令人惊讶的。

更新(2014)

有一个新的双授权项目,允许你将Chrome嵌入到你的。net应用程序中,名为Awesomium。它带有一个。net api,但需要相当多的技巧来呈现(示例将浏览器窗口绘制到缓冲区,将缓冲区绘制为图像并在计时器上刷新)。

认为这是Origin在战地3中使用的浏览器。

更新(2016)

现在有DotnetBrowser,一个商业替代Awesomium。它是以铬为基础的。

签出CefSharp net绑定,这是我不久前开始的一个项目,幸运的是它被社区所接受,并变成了一些很棒的东西。

该项目包装嵌入式铬框架,并已用于许多重大项目,包括Rdio的Windows客户端,Facebook Messenger for Windows和Github for Windows。

它具有WPFWinforms的浏览器控件,并具有大量的特性和扩展点。基于铬,它的速度也非常快。

从NuGet: dotnet add package CefSharp.Wpfdotnet add package CefSharp.WinForms中获取它

查看例子并给出你的想法/反馈/拉请求:https://github.com/cefsharp/CefSharp

BSD许可

你可以使用注册表来设置IE版本来控制web浏览器。 转到:HKLM\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION并添加browser_emulation值的"yourApplicationName.exe" 要查看browser_emulation的值,请参考链接:http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation

最近几天,我一直在测试c# Web浏览器组件的替代品,以下是我的列表:

1. 使用较新的IE版本8,9:

Web浏览器组件是IE7不是IE8?如何改变这种状况?< / >

优点:

  • 运行它不需要太多工作
  • 如果是IE9,支持一些HTML5/CSS3,如果是IE10,则完全支持

缺点:

  • 目标机器必须安装IE版本,Win7上的IE10仍在预览中

这并不需要太多的工作,你可以得到一些HTML5和CSS3的支持,尽管IE9缺乏一些最好的CSS3和HTML5功能。但我相信你可以让IE10以同样的方式运行。问题是目标系统必须安装IE10,而由于IE10仍在Windows 7的预览版中,我建议不要这样做。

2. OpenWebKitSharp

OpenWebKitSharp是一个基于webkit的webkit引擎的。net包装器。NET 0.5项目。WebKit是Chrome/Safari使用的布局引擎

优点:

  • 积极发展
  • HTML5和CSS3支持

缺点:

  • 许多特性没有实现
  • 不支持x64(应用程序必须为x86构建)

OpenWebKit非常好,尽管许多功能还没有实现,我在visual studio中使用它时遇到了一些问题,它在这里抛出空对象引用,然后在设计模式下,有一些js问题。每个使用它的人几乎都会立即注意到js的alert没有做任何事情。鼠标向上,鼠标向下……等不工作,js拖放是bug等..

我也有一些困难安装它,因为它需要特定版本的VC可重分发安装,所以在异常之后,我查看了事件日志,找到了VC版本并安装了它。

3.GeckoFX

优点:

  • 对单核细胞的研究
  • 积极发展
  • HTML5和CSS3支持

缺点:

  • D o e̶̶̶t年代n̶̶̶̶̶s̶̶u p p t o r̶̶̶̶̶̶̶x 6 4̶̶̶p p(̶̶̶̶̶m t u s̶̶̶̶̶̶b e̶̶t l我u̶̶̶̶̶̶̶̶o f r̶̶x 6 8̶̶̶)̶——请参见下面的评论
GeckoFX是一个跨平台Webrowser控件,用于嵌入到WinForms应用程序中。这可以在Windows上与. net一起使用,在Linux上与mono一起使用。

. Gecko是Firefox的布局引擎

我偶然发现一些信息说GeckoFX不是主动开发的,这是不正确的,当然它总是比Firefox落后一两个版本,但这是正常的,我对它的活动和控件本身印象深刻。它做了我需要的一切,但我需要一些时间让它运行,这里有一个小教程让它运行:

  1. 下载geckofx - windows - 16.0 - 0.2,在这里你可以检查更新的GeckoFX是否可用
  2. 为两个下载的dll添加引用
  3. 因为GeckoFX是你需要XulRunner的包装器,所以去版本列表看看你需要哪一个
  4. 现在我们知道了需要哪个版本的XulRunner,我们转到 Mozilla XulRunner发布,转到版本文件夹->运行时→xulrunner-(your_version).en-US.win32.zip,在我们的例子中xulrunner-16.0.en-US.win32.zip
  5. 解压缩所有文件,并复制所有文件到您的bin\Debug(或释放如果 你的项目被设置为释放)
  6. 找到窗体的visual studio设计器,找到工具箱,右键单击->选择物品->浏览→找到下载的GeckoFX winforms dll文件->好吧
  7. 现在你应该有一个新的控件GeckoWebBrowser

如果你真的必须使用Chrome,可以看看这个名为Awesomium的产品,它对非商业项目是免费的,但商业项目的许可证要几千美元。

Geckofx和Webkit.net一开始都很有前景,但它们分别没有跟上Firefox和Chrome的更新,而随着Internet Explorer的改进,Webbrowser控件也有所改进,尽管不管你有什么IE版本,默认情况下它都像IE7一样,但可以通过进入注册表并将其更改为允许HTML5的IE9来修复。

我知道这不是一个“替代”WebBrowser控件,但我有一些可怕的渲染问题,同时显示一个页面,使用BootStrap 3+布局等,然后我发现了一个帖子,建议我使用以下。显然,它是特定于IE的,并告诉它使用在客户端机器上找到的最新版本进行渲染(因此它不会使用IE7,我认为这是默认的)。

所以只要写:

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

在文档头部的某个地方。

显然,如果它不是你的文档,这不会有帮助-尽管我个人认为这是一个安全漏洞,如果你阅读的页面不是通过WebBrowser控件创建的-为什么不使用web浏览器!

我也遇到了同样的问题,网络浏览器使用的是旧版本的IE,通过一些谷歌搜索,我遇到了以下代码,使更改注册表,使网络浏览器使用最新的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

2020年7月更新

基于Chromium的WebView 2由微软发布。现在,您可以将新的Chromium Edge浏览器嵌入到. net应用程序中。

2018年5月更新

如果你的目标应用程序运行在Windows 10或更高版本上,那么现在你可以通过使用Windows社区工具包将Edge浏览器嵌入到你的。net应用程序中。

WPF示例:

  1. 安装Windows Community Toolkit Nuget包

    Install-Package Microsoft.Toolkit.Win32.UI.Controls
    
  2. < p > 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. < p > c代码:

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

更多信息请参考这个链接