Replacing .NET WebBrowser control with a better browser, like Chrome?
有没有相对简单的方法可以将现代浏览器插入.NET应用程序?
据我所知,
我使用的是Visual Studio C(速成版-这里有什么区别吗?)
我想在我的应用程序中集成一个好的Web浏览器。在某些情况下,我只是使用它来处理用户注册过程、与我的网站的某些功能的接口以及该顺序的其他事情,但是我有另外一个需要更多错误的应用程序。控制。
我需要:
- 可以集成到应用程序窗口(而不是单独的窗口)中的浏览器
- 对CSS、JS和其他Web技术的良好支持,与任何现代浏览器都不相上下。
- 基本浏览器功能,如"导航"、"后退"、"重新加载"…
- 自由访问页面代码和输出。
我在考虑Chrome,因为它是BSD许可证下的,但我也会对最新版本的IE感到高兴。
尽可能的让事情简单。最好的办法是修补现有的
我找到了一个Mozilla的ActiveX控件(http://www.iol.ie/~locka/mozilla/control.htm),但它看起来像是一个旧版本,所以不一定是一个改进。
我乐于接受建议
结帐cefsharp.net绑定,这是我不久前开始的一个项目,很幸运地被社区接受,并变成了一个美好的东西。
该项目包装了Chromium嵌入式框架,并已用于许多主要项目,包括RDIO的Windows客户端、Facebook Messenger for Windows和Github for Windows。
它具有用于WPF和WinForms的浏览器控件,并具有大量的功能和扩展点。以铬为基础,它也非常快。
从nuget拿过来:
查看示例并给出您的想法/反馈/拉动请求:https://github.com/cefsharp/cefsharp
特许经营执照
如果你不知道的话,Chrome会使用WebKit,Safari也会使用它。以下是几个具有相同特点的问题:
- 用C嵌入WebKit#
- 用C嵌入gecko(火狐引擎)#
webkit-one并不像其他答案所说的那样好,一个版本不再有效(google-code-one),而mono版本是实验性的。如果有人努力为它制作一个像样的.NET包装器,那就太好了,但这似乎不是任何人都想做的事情——这令人惊讶,因为它现在支持HTML5和IE(8)引擎所缺少的许多其他功能。
更新(2014)
新的双许可项目允许您将chrome嵌入到名为awesomium的.NET应用程序中。它附带了一个.NET API,但在渲染时需要相当多的代码(示例将浏览器窗口绘制到缓冲区,将缓冲区绘制为图像,并在计时器上刷新)。
我认为这是"战地3"中的源站所使用的浏览器。
更新(2016)
现在有了DotnetBrowser,这是Awsomium的商业替代品。它是以铬为基础的。
几天来,我一直在测试C Web浏览器组件的替代方案,以下是我的列表:
1。使用更新的IE版本8、9:
Web浏览器组件是IE7而不是IE8?如何改变这个?
赞成的意见:
- 运行它不需要很多工作
- 一些HTML5/CSS3支持IE9,支持IE10
欺骗:
- 目标计算机必须安装了目标IE版本,IE10在Win7上仍处于预览状态
这不需要很多工作,您可以获得一些HTML5和CSS3支持,尽管IE9缺少一些最好的CSS3和HTML5功能。但我相信你可以让IE10以同样的方式运行。问题是,目标系统必须安装IE10,因为它仍然在Windows7上预览,所以我建议不要这样做。
2。OpenWebKiTwitter
OpenWebKitsharp是基于WebKit.NET 0.5项目的WebKit引擎的.NET包装器。WebKit是Chrome/Safari使用的布局引擎
赞成的意见:
- 积极发展
- HTML5/CSS3支持
欺骗:
- 许多功能未实现
- 不支持x64(必须为x86生成应用程序)
openwebkit非常好,虽然很多功能还没有实现,但是我在使用它时遇到了一些问题,在Visual Studio中,它会在这里抛出空对象引用,然后在设计模式中,会出现一些JS问题。使用它的每个人几乎都会立即注意到JS警报没有任何作用。穆塞普、穆塞敦等事件…等等不起作用,JS拖拽是小车等等。
我在安装它时也遇到了一些困难,因为它需要安装特定版本的VC可再发行软件,所以在异常之后,我查看了事件日志,找到了VC版本并安装了它。
三。盖科夫克斯
赞成的意见:
- 单声道作品
- 积极发展
- HTML5/CSS3支持
欺骗:
- D?O?E?S?"?"t?S?U?P?P?O?R?T?X?6?4??A?P?P?M?U?S?T?B?E?B?U?我?L?T?f?O?R?X?8?6??)?-见下文评论
geckofx是一个跨平台的webrowser控件,用于嵌入到winforms应用程序中。这可以用于Windows上的.NET和Linux上的Mono。Gecko是Firefox使用的布局引擎。
我无意中发现了一些信息,即Geckofx并没有被积极开发,这是不正确的,当然它总是落后于火狐的一两个版本,但这是正常的,我对活动和控件本身印象深刻。它完成了我需要的一切,但我需要一些时间来运行它,下面是一个小教程来运行它:
如果您真的必须使用Chrome,请看一看这个名为awesomium的产品,它对于非商业项目是免费的,但是对于商业项目,许可证是几千美元。
我也遇到了同样的问题,WebBrowser使用的是旧版本的IE,通过谷歌搜索,我发现了以下代码,这些代码对注册表进行了更改,使WebBrowser可以使用最新的IE版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | 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; } } |
您只需要创建一个类并将此代码放入其中,然后在程序启动时运行以下代码:
1 2 3 4 | if (!WBEmulator.IsBrowserEmulationSet()) { WBEmulator.SetBrowserEmulationVersion(); } |
VB.NET:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | 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 |
你可以这样使用它:
1 2 3 | If Not WBEmulator.IsBrowserEmulationSet() Then WBEmulator.SetBrowserEmulationVersion() End If |
可以使用注册表为WebBrowser控件设置IE版本。转到:hklmsoftwaremicrosoftinternet explorermainfeaturecontrolfeaturerowseru emulation并添加"yourapapplicationname.exe",其值为browseru emulation要查看浏览器模拟的值,请参阅以下链接:http://msdn.microsoft.com/en-us/library/ee330730%28vs.85%29.aspx浏览器模拟
看看mono.webbrowser控件-它将gecko(由firefox使用)或webkit(由safari使用)嵌入到winforms(不使用activex)。
我知道这不是"替换"WebBrowser控件,但是我在显示使用bootstrap 3+进行布局等的页面时遇到了一些糟糕的渲染问题,然后我找到了一篇建议我使用以下内容的文章。显然它是特定于IE的,并告诉它使用客户端机器上找到的最新变体进行渲染(因此它不会使用IE7,因为我认为这是默认的)。
所以只要放:
1 | <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> |
在文件的头部分。
如果这当然不是您的文档,那么这显然没有帮助(尽管我个人认为如果您阅读的页面不是自己通过WebBrowser控件创建的-为什么不使用WebBrowser!)
祝你好运。
看看dotnetbrowser库。它提供了基于Chromium的WPF和WinForms浏览器控件,这些控件很容易嵌入到.NET应用程序中。它支持所有现代Web标准,包括HTML5、CSS3和JavaScript。呈现的页面与Google Chrome中的页面完全相同。
库继承了Chromium的多进程体系结构——每个网页都在单独的Chromium进程中呈现,即使在插件崩溃或网页上出现任何其他意外错误之后,应用程序也将继续工作。
DotNetBrowser还提供了一些其他有用的功能:可以侦听加载事件、处理网络活动、配置代理、模拟用户操作、使用cookie、访问和修改DOM、侦听DOM事件、从.NET调用javascript,或者从.NET调用javascript、在网页上使用Web摄像机和麦克风、设置基于WebRTC的Commun还有更多。
有关详细信息,请参阅API参考。
下面的代码片段演示了如何创建browserview、将其嵌入表单以及加载URL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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包使用。
我尝试过几种WebKit变体,但在我的经验中,没有什么能比OpenWebKitsharp的进步更出色。爱它,爱它……HTML5和CSS3的分数尽可能接近谷歌Chrome。非常好的API和事件模型。如果您发现"未实现"API很可能是因为它们没有在WebKit中实现。其他一切都很好。
OpenWebKitSharp is a .net wrapper for the webkit engine based on the
WebKit.NET 0.5 project. It adds more functionality to the 0.5 version
and it provides more methods than that build. OpenWebKitSharp supports
both the Cairo build (0.5) and the nightly builds of webkit (Nightly
by default). In Version 1.5 Stable and more the nightly build is
included and automatically copied after building. In earlier versions
this happens with the cairo build. OpenWebKitSharp currently powers
GTLite Navigator, a fast, stable and flexible web browser.
尝试eo.webbrowser。它是新的,基于最新版本的Chrome浏览器。它最好的部分是将所有内容都打包到一个.NET DLL中,这样不仅使用和部署非常简单,而且同一个DLL同时支持32位和64位,因为它是.NET DLL。
我用过壁虎,它对我很有帮助。它使用火狐引擎。我遇到的唯一警告是,它在文档实际完全加载之前发出一次"document loaded"事件…我认为它会在加载HTML时拍摄一个,然后在加载所有图像和内容时拍摄另一个。我只是简单地忽略了第一个问题,解决了这个问题,到目前为止,它工作得非常出色。
你可以在这里找到它:https://bitback.org/geckofx/
像大多数体面的图书馆一样,它是开源的。
更新2018可能
如果您的目标是在Windows 10上运行应用程序,那么现在您可以使用Windows社区工具包将边缘浏览器嵌入到.NET应用程序中。
WPF实例:
1)安装Windows社区工具包nuget包
1 | Install-Package Microsoft.Toolkit.Win32.UI.Controls |
2)XAML代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <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代码:
1 2 3 4 5 6 7 8 9 10 | 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示例:
1 2 3 4 5 6 7 8 9 10 | 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")); } } |
有关详细信息,请参阅此链接。
moznet是一个.NET控件,以前基于或多或少被放弃的geckofx控件,但现在正处于完全开发阶段,并且拥有比geckofx更强大的功能。你可以在SE7en软件网站上找到它。
浏览器控制快速简单。它有Chrome浏览器引擎,可用于任何版本的.NET。
https://visualtudiogallery.msdn.microsoft.com/fcee0646-42e7-484f-b2e-f8b2ace55dd7
注意:这是一种商业许可产品,我不会在推广时考虑到这一点。在尝试了各种各样的东西之后,我最终选择了这个。
更新2016:
我可以建议另外3个选项:
1。BrowseEmAll
可用于将Chrome引擎集成到.NET应用程序中的.NET组件。基于CefGlue,但更新到最新的Chrome版本时速度稍快。此外,还有一个商业支持选项,对某些人来说可能很方便。当然,组件本身是开源的。
2。browseemall.壁虎
另一个.NET组件,可用于将Firefox引擎集成到.NET应用程序中。这是基于geckofx的,但与当前版本的geckofx不同的是,它可以与普通版本的firefox一起使用。要使用Geckofx,您需要自己构建Firefox。同样,商业支持是可用的,但组件本身是完全开源的。
三。浏览商城核心API
需要.NET应用程序中所有不同的浏览器吗?你可以将Chrome、Firefox、Webkit和Internet Explorer集成到你的应用程序中。尽管如此,这是一种商业产品。
(完全披露:我为这家公司工作,所以我说的每一句话都要带上一点盐)
查看geckofx控件。
geckofx和webkit.net一开始都很有希望,但在Internet Explorer改进的同时,它们没有分别跟上火狐和Chrome的最新发展,webrowser控件也是如此,尽管默认情况下它的行为类似于IE7,不管您有什么IE版本,但可以通过进入注册表并将其更改为IE9,从而允许HTML5。
如果您正在寻找一个不错的基于IE的控件——请查看:http://code.google.com/p/csexwb2/
我把它用于生产产品。它很好,演示也很好,不过现在的维护情况似乎不如以前了。
我尝试过所有的浏览器。不幸的是,在所有情况下,唯一真正适合我的是eo.browser。我希望我可以选择一个免费的解决方案,但最终我选择了eo.browser。它很贵,但保养得很好。
更新2016:
对我来说,唯一可靠的、维护良好的浏览器替代IE是eo.webbrowser。我花了好几天又一周的时间去尝试其他的方法。他们所有人都有一些问题在某个时候阻止了我的演出。