用更好的浏览器(例如Chrome)替换.NET WebBrowser控件?


432

有没有相对简单的方法将现代浏览器插入.NET应用程序?

据我了解,该WebBrowser控件是IE的包装,这不会有什么问题,只不过它看起来像是IE的一个很老的版本,所有这些都涉及CSS破坏,潜在的安全风险(如果未对渲染引擎进行修补,那么我真的可以期望解决不计其数的缓冲区溢出问题吗?)以及其他问题。

我正在使用Visual Studio C#(速成版-在这里有什么区别吗?)

我想在我的应用程序中集成一个好的Web浏览器。在某些情况下,我只是使用它来处理用户注册过程,与我的网站的某些功能进行交互以及按此顺序进行其他操作,但是我想到的另一个应用程序将需要更多错误...控制。

我需要:

  • 可以集成到我的应用程序窗口(而不是单独的窗口)中的浏览器
  • 与任何现代浏览器一样,对CSS,js和其他Web技术的良好支持
  • 基本的浏览器功能,例如“导航”,“后退”,“重新加载” ...
  • 自由访问页面代码和输出。

我一直在考虑Chrome,因为它获得了BSD许可,但我对IE的最新版本同样满意。

我想让事情尽可能简单。最好的办法是修补现有的WebBrowser控件,该控件已经完成了我所需控件的70%,但我认为这是不可能的。

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

我愿意接受建议


19
为什么说WebBrowser控件使用旧版本的IE?它利用安装在用户的系统上的版本,虽然IE8的WebBrowser似乎默认为IE7渲染:blogs.msdn.com/ie/archive/2009/03/10/...
蒂姆·罗宾逊

17
因为在我的机器上看起来不是那样。我已经安装了IE8,但控件显示的显示问题是自IE 5以来从未出现过的。一个非常简单的登录表单,两个带有CSS的字段显示乱码,并且某些javascript显示不起作用,而它却显示在IE8,Firefox,Chrome,Opera中都可以使用...所以我认为渲染引擎是旧的。我对此可能完全错了,也许这个问题实际上与我的想法有所不同。
Sylverdrag

3
@Sylverdrag:你错了。它使用系统上的最新IE。但是,我在某处读到WebBrowser控件比独立浏览器具有更强的向后兼容性问题。IE8可以具有一个图标,例如单击以打开IE7模式。作为程序的一部分,这是不可能的,因此该控件默认为较早的模式以实现兼容性。OTOH,我尚未阅读如何将其设置为使用“ IE8模式”。
约翰·桑德斯

55
实际上,约翰·桑德斯,你错了。它使用ie4,并且您需要更改注册表值以告诉它使用current。查找“功能模式仿真”,您会得到乌拉圭回合的答案,最近更改了,曾经包含关键字native,但他们更改了它,用Google用“ webbrowser控件”提到的关键字,您会找到msdn文章。
Erx_VB.NExT.Coder 2010年

8
默认情况下,WebBrowser除非使用另行指示,否则托管控件将使用IE7仿真FEATURE_BROWSER_EMULATION。这是记录在这里:blogs.msdn.com/b/askie/archive/2009/03/23/...
noseratio

Answers:


171

结帐CefSharp .Net绑定,这是我不久前开始的一个项目,值得庆幸的是,该项目被社区所采用,并变成了一件很棒的事情。

该项目包装了Chromium嵌入式框架,并已在多个主要项目中使用,包括Rdio的Windows客户端,Windows的Facebook Messenger和Windows的Github。

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

从NuGet获取它:Install-Package CefSharp.WpfInstall-Package CefSharp.WinForms

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

BSD许可


2
我从OWS切换到CEfSharp,可以肯定地说它是一个非常高质量且活跃的社区。爱它。github.com/cefsharp/CefSharp
Vin

1
CefSharp很棒,但是请注意,库太大(我上次看了20 MB以上),因此它们可能不适合轻量级项目。
Skyl3lazer

1
@ANguyen是的,您可以
chillitom 2016年

1
非常高兴得知是您启动了这个项目!最近,我使用了cefsharp,但是,我可以看到该库的大小是80+ MB,这是巨大的,但是对于正常运行应用程序(特别是平滑渲染)是必需的。有什么办法可以减少这种情况?
阿迪亚·博卡德

5
这破坏了我的项目。在安装winforms nuget软件包后,所有引用均断开。
toddmo '17

84

如果您不知道,Chrome会使用Webkit(的一个分支),Safari也使用它。以下是一些同样的问题:

该webkit不能像其他答案那样出色,一个版本不再有效(谷歌代码一个),而Mono则是实验性的。如果有人为它做一个像样的.NET包装程序而很好,但这不是任何人似乎都不想做的事情-令人惊讶的是,它现在已经支持HTML5和IE(8 )引擎缺乏。

更新(2014)

有一个新的双许可项目,可让您将Chrome嵌入到名为Awesomium的 .NET应用程序中。它附带了.NET api,但是需要相当多的技巧才能进行渲染(示例将浏览器窗口绘制到缓冲区,将缓冲区绘制为图像并在计时器上刷新)。

认为这是《战地风云3》中Origin所使用的浏览器。

更新(2016)

现在有DotnetBrowser,它是Awesomium的商业替代品。它基于Chromium。


谢谢。我将看看壁虎包装纸。但是,有一件事,原始答案是“您需要做的就是注册Mozilla ActiveX控件”,我认为Express版本无法注册其他控件。我是否缺少明显的东西?
Sylverdrag

4
@Syl Express版本可以根据需要注册尽可能多的控件。他们不会做的是让您将插件安装到Visual Studio。
Joel Coehoorn

1
我曾经在C#中使用WebKit经历过非常糟糕的经历,最后我不得不决定使用.NET附带的默认Web浏览器组件
Sumit Ghosh 2010年

1
截至目前,上述项目尚不能替代现有项目。编译器错误异常严重+不稳定。Awesomium,是完整的并且完全是垃圾。
Kraang Prime

“我认为这是《战地风云3》中Origin使用的浏览器。” 这是不正确的。我知道这一点是因为我不得不强迫该应用在Windows 10上使用,因为默认情况下它无法运行。这是前一阵子,可能已经解决了。
Theyouthis

64

几天来我一直在测试C#Web浏览器组件的替代方法,这是我的清单:

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

Web浏览器组件是IE7还是IE8?如何改变呢?

优点:

  • 使它运行不需要太多的工作
  • 如果是IE9,则支持某些HTML5 / CSS3;如果是IE10,则支持全部

缺点:

  • 目标计算机必须已安装目标IE版本,IE10仍在Win7上处于预览状态

这不需要太多工作,尽管IE9缺少一些CSS3和HTML5的最佳功能,但您可以获得HTML5和CSS3的支持。但我相信您可以使IE10以相同的方式运行。问题在于目标系统必须安装IE10,并且由于仍在Windows 7上处于预览状态,因此我建议您反对它。

2. OpenWebKitSharp

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

优点:

  • 积极开发
  • HTML5 / CSS3支持

缺点:

  • 许多功能未实现
  • 不支持x64(必须为x86构建应用)

尽管尚未实现许多功能,但OpenWebKit非常不错,我在Visual Studio上使用它时遇到了一些问题,在这里将null对象引用抛出此错误,然后在设计模式下,存在一些js问题。每个使用它的人几乎都会立即注意到js alert什么也没有做。诸如mouseup,mousedown ...之类的事件不起作用,js拖放存在错误,等等。

由于安装了特定版本的VC可再发行组件,因此安装它时也遇到了一些困难,因此在出现异常后,我查看了事件日志,找到了VC版本并进行了安装。

3. GeckoFX

优点:

  • 适用于单声道
  • 积极开发
  • HTML5 / CSS3支持

缺点:

  • D̶o̶e̶s̶n̶'̶t̶̶s̶u̶p̶p̶o̶r̶t̶̶x̶6̶4̶̶(̶A̶p̶p̶̶m̶u̶s̶t̶̶b̶e̶̶b̶u̶i̶l̶t̶̶f̶o̶r̶̶x̶8̶6̶)评论

GeckoFX是用于嵌入WinForms应用程序中的跨平台Webrowser控件。可以将其与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(如果项目设置为release,则释放)
  6. 转到表单的Visual Studio设计器,转到工具箱,右键单击内部->选择项目->浏览->查找下载的GeckoFX winforms dll文件->确定
  7. 现在您应该有了新的控件GeckoWebBrowser

如果您真的必须使用Chrome,请看看这款名为Awesomium的产品,它对于非商业项目是免费的,但商业许可的价格为数千美元。


4
关于如何启动和运行GeckoFx的很好的描述。+1
Alex Essilfie

在构建Geckofx-Winforms时,我需要4个gtk#库(atk-sharp,gdk-sharp,glib-sharp和gtk-sharp),因此我必须先安装Mono。
bernhardrusch 2013年

这个答案是惊人的。
Mike Cole 2014年

确实是一个很好的分析。我想知道您是否碰巧用C#应用程序测试Awesomium。你有什么话要说吗?我尚未对其进行测试,但在查看他们在页面上提到的受托人小组后,对我来说似乎是可靠的。
Abdul Rehman 2014年

2
@Wayne如果要正确执行操作,则应在项目或单独的项目中创建一个文件夹,其中将包含所有文件,gecko fx dll和xulRunner文件,并将它们设置为始终复制,然后在每次构建操作时它们都会得到复制到您的build / debug文件夹或从VS发布的情况下发布,或者还有Xpcom.Initialize方法,您应该调用该方法,并将其传递给xul运行程序文件路径,希望对您有所帮助
有所 formatc

41

我遇到了同样的问题,WebBrowser使用的是旧版本的IE,通过一些搜索,我遇到了以下代码,这些代码更改了注册表,并使WebBrowser可以使用最新的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

1
优秀的!!非常感谢!

1
转换为Python(在IronPython应用程序上工作),效果很好。谢谢!
大卫,

1
那救了我的命!谢谢
Neeraj Dubey

1
这太棒了,但是可以重置仿真版本吗?看来该版本只能在WinForms应用程序中设置一次。尽管有可能看起来好像被重置了,但效果是,一旦设置并重置了注册表,就不会在WinForms应用程序中用新的注册表值重新读取它。
cymorg

1
据我所知,
@ DarrenMB

27

您可以使用注册表来设置用于Web浏览器控件的IE版本。转到:HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION并添加带有browser_emulation值的“ yourApplicationName.exe”要查看browser_emulation的值,请参阅链接:http : //msdn.microsoft.com/zh-cn /library/ee330730%28VS.85%29.aspx#browser_emulation


10
而且,如果您要在Visual Studio中进行调试,则可能必须使用“ yourApplicationName.vshost.exe”
newenglander 2012年

3
而且,如果要在Visual Studio中进行调试,则可能只需在项目属性的“调试”选项卡上取消选中“启用Visual Studio托管过程”即可。然后,您可以使用不带“ vshost”部分的exe名称。
Daniel Vygolov 2014年

1
@golavietnam能否请您帮忙,我尝试了您的说明,并使用您提供的链接上的说明,但仍然无效。当我使用webbrowser控件访问WhatIsMyBrowser.com时,它告诉我我在ie 7兼容模式下使用ie11 BUT,并且许多网站拒绝工作,并给我“请升级浏览器”消息。如何强制Web浏览器控件使用这种方式安装的最新版本的ie(即11)不起作用,我已经尝试了100次。
jay_t55 2014年

谢谢你,它的工作和救了我的一天
谭阮


16

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

因此,只需输入:

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

文档头部的某处。

如果当然不是您的文档,那么这显然无济于事(尽管我个人认为这是一个安全漏洞,如果您正在阅读不是通过Web浏览器控件自己创建的页面,为什么不使用Web浏览器!)

祝好运。


如果你想这对IE7运行在PC上工作时,不要把它放在什么地方<head>,把它作为的第一个孩子<head>。我们花了一段时间才弄清楚这一点。
西尔万2014年

抱歉,我在以前的评论中不是IE8。因此,在IE8上,如果不将放置<meta>为的第一个子代<head>,它将在兼容模式下运行,而不是在边缘模式下运行。
西尔万2014年

我在winform应用程序中使用了webbrowser插件,这是一个巨大的帮助。我打的页面使用的是jquery和angularjs,这很令人讨厌,因为即使我已安装IE10,它也认为浏览器是IE7。
Kywillis 2014年

那对我有用!您还可以使用它来设置IE的特定版本,例如:<meta http-equiv =“ X-UA-Compatible” content =“ IE = 10” />并始终将浏览器工作为10(当然,您需要安装了相同或更高版本的软件
freedeveloper 2015年

这对于我的用例来说是完美的。我想显示更好的html格式的报告。已经有很多CSS内容可用。这比嵌入chrome / firefox更好。
MD路飞2015年

13

看一下DotNetBrowser库。它提供了基于Chromium的WPF和WinForms浏览器控件,它们很容易嵌入到.NET应用程序中。它支持所有现代Web标准,包括HTML5,CSS3和JavaScript。呈现的页面与Google Chrome中的外观完全相同。

该库继承了Chromium的多进程体系结构–每个网页均在单独的Chromium进程中呈现,并且即使插件崩溃或网页上发生任何其他意外错误,应用程序仍将继续工作。

以下是DotNetBrowser提供的一些其他有用功能:可以侦听加载事件,处理网络活动,配置代理,模拟用户操作,使用Cookie,访问和修改DOM,侦听DOM事件,从.NET调用JavaScript。反之亦然,使用网页上的网络摄像头和麦克风,设置基于WebRTC的通信,等等

查看API参考以获取更多详细信息。

下面的代码段演示了如何创建BrowserView,将其嵌入到Form中以及加载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包的形式提供。


16
当心此产品的
高价

3
它不是开源的,它的许可证也不便宜。
Ashish-BeJovial,

8

我已经尝试了几种 Webkit变体,但是以我的经验,没有什么比OpenWebkitSharp的进步更好。爱它就爱它。HTML5和CSS3得分与Google Chrome得分接近。非常好的API和事件模型。如果您发现“未实现”的API,很有可能是因为Webkit中未实现它们。其他一切都很好。

OpenWebKitSharp是基于WebKit.NET 0.5项目的Webkit引擎的.net包装器。它为0.5版本增加了更多功能,并且提供了比该版本更多的方法。OpenWebKitSharp支持Cairo构建(0.5)和夜间的Webkit构建(默认情况下为每晚)。在1.5版中,稳定版及更多版本包含每晚构建,并在构建后自动复制。在早期版本中,这种情况是在cairo构建中发生的。OpenWebKitSharp当前为GTLite Navigator(快速,稳定和灵活的Web浏览器)提供支持。


1
谢谢。看起来很棒!
Sylverdrag

他们的论坛也非常活跃,我对自己的问题得到了很快的答复。现在,我将其用于所有Web浏览器控件需求
Vin

2
是的,它完成了所有工作,您调用ExecuteScript。但是我改用CefSharp了,我可以告诉你,我比OWS更喜欢它
Vin

1
另一个令人厌恶的混乱代码无法使用。
Kraang Prime

1
当心Webkit不能使用代理即时通讯对此有问题
skhurams

7

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

请参考此链接以获取更多信息。


我确实安装了Nuget软件包,但无法正常工作。还是ty。
Deniz

6

试试EO.WebBrowser。它是新的,并且基于最新版本的Chrome浏览器。最好的部分是,它将所有内容打包在一个.NET dll中,因此不仅非常易于使用和部署,而且由于它是.NET dll,因此同一DLL支持32位和64位。


9
将来,请声明这是一种商业许可产品,以及您是否与该产品有任何从属关系,请参阅常见问题解答中的避免公开宣传
安迪·布朗

1
在搜索“ YEARS”的疯人院之后,这个“商业”控件实际上是IE的唯一有效的直接替代品,我不必大惊小怪,也没有弄乱我当前使用的任何浏览器设置。-如果举报,我不会以任何形式与EO相关。我很生气,所有其他所有解决方案都是完全-完全浪费所有时间。
Kraang Prime

@SanuelJackson GeckoFx在我的公司中运行正常,并且没有导致浏览器设置出现任何问题
Wayne

@Wayne-对您来说很好。这些开放项目都不是直接替换的项目,需要进行大量修改才能用作托管代码,尤其是作为直接插入的winforms控件。它们要么缺少IE控件提供的功能和/或由于它们不断崩溃而变得很完整,要么很慢-甚至无法在此处列出所有问题。也许再过十年,当互联网不再需要网络浏览器时,也许可行的东西就会出现。
Kraang Prime

@SanuelJackson嗯,我希望你说的是真的。不幸的是,对我来说,所有其他选择(包括GeckoFX)都没有出现任何令人震惊的错误。我也希望我可以避免Essential Objects浏览器的高价。但这是唯一为我完美工作的产品。
Maiken Roskilde

5

我使用了GeckoFX,它为我提供了很好的服务。它使用Firefox引擎。我遇到过的唯一警告是,它在文档实际完全加载之前会发出一次“ DocumentLoaded”事件……我认为它在加载HTML时会发出一个,而在所有HTML加载时会发出一个图像和东西被加载。我已经解决了,只需忽略第一个就可以了,到目前为止,它的运行非常完美。

您可以在这里找到它:https : //bitbucket.org/geckofx/

像大多数体面的图书馆一样,它是开源的。


2
所有可运行的基于Firefox的组件都会与Firefox的用户安装捆绑。幸运的是,大多数解决方案都无法正常工作,如果幸运的话,它可以使您的Firefox设置保持完整---不太幸运,您丢失了所有设置,并且仍然没有比IE更好的插件。
Kraang Prime

1
链接已死且来自旧版本。 bitbucket.org/geckofx当前版本
Wayne'Aug

@Sanual Jackson-我使用GeckoFx多年,但从未遇到用户安装Firefox的任何问题-包括我自己的问题。你只是在猜?
PandaWood

3

MozNet是一个.NET控件,以前基于或多或少废弃的GeckoFX控件,但仍处于全面开发中,并且具有比GeckoFX可以撼动的更多功能。您可以在Se7en Soft网站上找到它。


1
GeckoFX正在积极发展在:到位桶
韦恩


2

2016年更新:

我可以建议3个其他选项:

1. BrowseEmAll.Cef

.Net组件,可用于将Chrome引擎集成到您的.Net应用程序中。基于CefGlue,但更新到最新的Chrome版本要快一些。另外,还有一些商业支持选项可能对某些用户派上用场。当然,组件本身是开源的

2. BrowseEmAll.Gecko

另一个.Net组件,可用于将Firefox引擎集成到您的.Net应用程序中。它基于Geckofx,但与当前版本的Geckofx不同,它将与Firefox的常规发行版一起使用。要使用Geckofx,您需要自己构建Firefox。再次有商业支持可用,但组件本身是完全开源的

3. BrowseEmAll核心API

.Net应用程序中需要所有不同的浏览器吗?您可以使用哪种BrowseEmAll Core API 将Chrome,Firefox,Webkit和Internet Explorer集成到您的应用程序中。请注意,这是一种商业产品

(充分披露:我在这家公司工作,所以我说的一丁点都说不定)


1

如果您正在寻找基于IE的漂亮控件,请访问:http : //code.google.com/p/csexwb2/

我已经在生产产品中使用过它。它现在很好,并且具有良好的演示,尽管现在似乎没有像以前那样得到很好的维护。


1

Geckofx和Webkit.net最初都很有前途,但是随着Internet Explorer的改进,它们并没有分别与Firefox和Chrome保持同步,尽管无论您使用的是哪个IE版本,默认情况下,Webbrowser控件的行为都像IE7一样,但是有,但是可以通过进入注册表并将其更改为允许HTML5的IE9来解决。




0

我尝试了所有在那里的浏览器。不幸的是,在所有情况下对我真正有用的唯一工具是EO.Browser。我希望我可以选择一个免费的解决方案,但最终选择了EO.Browser。这是很贵的,但是维护得很好。


0

2016年更新:

对我来说,唯一可靠的,可维护的IE浏览器替代产品是EO.WebBrowser。我花了几天和一周的时间尝试其他方法。他们所有人都遇到了一些问题,这在某种程度上阻止了我的演出。


1
好吧...我围了一个星期?试图使MS WebBrowser正常工作-无济于事。除了EO.WebBrowser第一次为我工作以外,没有尝试其他任何=:-{ 因此,使用EO和成功需要20分钟,而使用MS则需要5天,并且完全失败。我现在要做的就是找到750美元以购买“成功”商品!
理查德·哈蒙德

0

可能值得在这里查看诸如WebKitX的商业产品:https : //www.webkitx.com

在此处输入图片说明

它使用Chromium嵌入式框架并在Windows XP,7、8、10上呈现HTML5,WebGL,PDF和Flash。它还提供了32位和64位版本的控件。

它使用类似于IE WebBrowser控件的COM对象提供DOM访问:

在此处输入图片说明

您可以通过传递标量参数的函数名称来调用JavaScript(不使用eval),并且它还具有Angular的JavaScript回调

在此处输入图片说明

您可以将自己的可互操作的COM对象添加到JavaScript:

在此处输入图片说明

它支持HTML5游戏的WebGL / WebAudio,可以在Citrix环境中禁用它:

在此处输入图片说明


我在生产中使用它,并且我完全信任它。我尝试了许多其他方法,但仍无法使用该浏览器。开发人员真的很好,很“个人化”。我没有和其他许多人一样感到孤独。真正好的稳定产品。
tmighty

SO要求免责声明,因此Elias最好指出他是mobilefx的CTO,后者是WebkitX的创建者
hko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.