首页 文章

用更好的浏览器替换.NET WebBrowser控件,比如Chrome?

提问于
浏览
376

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

据我所知, WebBrowser 控件是 IE 的包装器,除了它看起来像是 IE 的一个非常旧的版本之外不会有问题,所有这些都需要CSS搞砸,潜在的安全性风险(如果渲染引擎没有打补丁,我真的可以期待修复多个缓冲区溢出问题吗?)和其他问题 .

我正在使用Visual Studio C#(快速版 - 它在这里有什么不同吗?)

我想在我的应用程序中集成一个好的Web浏览器 . 在某些情况下,我只是用它来处理用户注册过程,与我的网站的一些功能和该命令的其他东西的接口,但我有另一个应用程序,需要更多错误...控制 .

我需要:

  • 可以集成到我的应用程序窗口内的浏览器(不是单独的窗口)

  • 对CSS,js和其他网络技术的良好支持,与任何现代浏览器相同

  • 基本浏览器功能,如"navigate","back","reload" ......

  • 自由访问页面代码和输出 .

我正在考虑Chrome,因为它属于BSD许可证,但我会对最新版本的IE感到满意 .

尽可能地,我想保持简单 . 最好的情况是,如果一个人可以修补现有的 WebBrowser 控制,这已经占我所需要的大约70%,但我不可能 .

我找到了一个用于Mozilla的ActiveX控件(http://www.iol.ie/~locka/mozilla/control.htm),但看起来它不一定是一个改进 .

我愿意接受建议

20 回答

  • 81

    查看GeckoFX控件 .

  • 60

    如果您不知道,Chrome会使用(一个分支)Webkit,这也是Safari使用的 . 这里有几个相同的问题:

    webkit一个不是很好,因为其他答案说明,一个版本不再有效(谷歌代码一个)和Mono一个是实验性的 . 如果有人努力为它制作一个体面的.NET包装器会很好,但这不是任何人似乎想做的事情 - 这是令人惊讶的,因为它现在支持HTML5以及IE的许多其他功能(8 )引擎缺乏 .

    Update (2014)

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

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

    Update (2016)

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

  • 4

    Geckofx和Webkit.net最初都很有希望,但是随着Internet浏览器的改进,它们并没有跟上Firefox和Chrome的最新状态,Webbrowser控件也是如此,尽管默认情况下它的行为类似于IE7而不管IE版本是什么但是可以通过进入注册表并将其更改为允许HTML5的IE9来修复 .

  • 22

    UPDATE 2018 MAY

    如果您的目标是在Windows 10上运行应用程序,那么现在可以使用Windows Community Toolkit将Edge浏览器嵌入到您的.net应用程序中 .

    WPF Example:

    1)安装Windows社区工具包Nuget包

    Install-Package Microsoft.Toolkit.Win32.UI.Controls -Version 3.0.0-preview
    

    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 Example:

    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 .

    注意:此库处于预览阶段 .

  • 8

    我已经尝试了所有的浏览器 . 不幸的是,在所有情况下真正为我工作的唯一一个是EO.Browser . 我希望我能选择一个免费的解决方案,但我最终得到了EO.Browser . 它非常昂贵,但维护得很好 .

  • 18

    我几天前一直在测试C#Web浏览器组件的替代品,这是我的列表:

    1. Using newer IE versions 8,9:

    Web Browser component is IE7 not IE8? How to change this?

    优点:

    • 让它运行不需要太多工作

    • 如果IE9支持一些HTML5 / CSS3,如果是IE10则全部

    缺点:

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

    这不需要太多工作,你可以获得一些HTML5和CSS3支持虽然IE9缺乏一些最好的CSS3和HTML5功能 . 但我相信你可以让IE10以同样的方式运行 . 问题是目标系统必须安装IE10,并且由于仍然在Windows 7上进行预览,我建议不要使用它 .

    2. OpenWebKitSharp

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

    优点:

    • 积极开发

    • HTML5 / CSS3支持

    缺点:

    • 许多功能未实现

    • 不支持x64(必须为x86构建应用程序)

    虽然很多功能还没有实现,OpenWebKit还是相当不错的,我在使用visual studio时遇到了一些问题,它在这里抛出空对象引用,然后在设计模式下,有一些js问题 . 每个人使用它几乎会立即注意到js警报什么都不做 . 像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是一个跨平台的Webrowser控件,用于嵌入到WinForms应用程序中 . 这可以在Windows上使用.NET,在Linux上使用mono . Gecko是Firefox使用的布局引擎 .

    我碰到了GeckoFX没有积极开发的一些信息,这是不正确的,当然它总是一两个版本落后于Firefox,但这是正常的,我对活动和控件本身印象非常深刻 . 它可以完成我需要的一切,但是我需要一些时间才能让它运行,这是一个让它运行的小教程:

    • 下载GeckoFx-Windows-16.0-0.2,在这里你可以检查一下是否有更新GeckoFX

    • 添加对两个下载的dll的引用

    • 由于GeckoFX是包装器,你需要XulRunner,转到Version List看看你需要哪一个

    • 现在我们知道我们需要哪个版本的XulRunner,我们转到Mozilla XulRunner releases,转到版本文件夹 - >运行时 - > xulrunner-(your_version).en-US.win32.zip,在我们的例子中xulrunner-16.0.en-US.win32.zip

    • 解压缩所有内容并将所有文件复制到bin \ Debug(如果项目设置为release,则发布)

    • 转到您的表单的视觉工作室设计器,转到工具箱,右键单击里面 - >选择项目 - >浏览 - >查找下载的GeckoFX winforms dll文件 - >确定

    • 现在你应该有新的控件GeckoWebBrowser

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

  • 2

    Update 2016:

    我可以建议另外3个选项:

    1. BrowseEmAll.Cef

    一个.Net组件,可用于将 Chrome engine 集成到.Net应用程序中 . 基于CefGlue,但对最新Chrome版本的更新速度要快一些 . 还有一个 commercial support 选项可供一些人派上用场 . 当然组件本身是 open source .

    2. BrowseEmAll.Gecko

    另一个.Net组件,可用于将 Firefox engine 集成到.Net应用程序中 . 这是基于Geckofx,但与当前版本的Geckofx不同,这将适用于Firefox的正常发布版本 . 要使用Geckofx,您需要自己构建Firefox . 同样 commercial support 可用,但组件本身完全 open source .

    3. BrowseEmAll Core API

    需要.Net应用程序中的所有不同浏览器?哪个BrowseEmAll Core API可以 integrate Chrome, Firefox, Webkit and Internet Explorer 进入您的应用程序 . 这是一个 commercial product 虽然如此警告 .

    (完全披露:我为这家公司工作,所以我用一粒盐说我拿的一切)

  • 1

    EO.BrowserControl快速简便 . 它具有Chrome浏览器引擎,可与任何版本的.NET配合使用

    https://visualstudiogallery.msdn.microsoft.com/fcee0646-42e7-484f-b22e-f8b2ace55dd7

    注意:这是一个商业许可的产品,我没有考虑到这一点 . 在尝试了各种其他事情后,我最终选择了这个 .

  • 26

    2016年更新:

    对我来说,IE唯一可靠,维护的浏览器替代方案是EO.WebBrowser . 我花了几天时间尝试其他人 . 他们所有人都有一些问题在某些时候阻止了我 .

  • 5

    结帐 CefSharp .Net绑定,我开始了一段时间的项目,谢天谢地被社区接收并变成了一些美妙的东西 .

    该项目包含了Chromium Embedded Framework,并已用于许多重大项目,包括Rdio的Windows客户端,Facebook的Windows Messenger和Windows的Github .

    它具有WPF和Winforms的浏览器控件,并具有大量功能和扩展点 . 基于Chromium,它的速度也非常快 .

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

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

    BSD许可

  • 3

    您可以使用注册表为webbrowser控件设置IE版本 . 转至:HKLM \ SOFTWARE \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION并添加"yourApplicationName.exe",其值为browser_emulation要查看browser_emulation的值,请参阅链接:http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation

  • 1

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

    所以就这样说:

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

    位于文档头部的某处 .

    如果当然不是你的文件,那么这个显然不会有所帮助(虽然我个人认为如果你正在阅读不是由你自己通过webbrowser控件创建的页面,这是一个安全漏洞 - 为什么不只是使用webbrowser!)

    祝好运 .

  • 1

    如果您正在寻找一个不错的基于IE的控件 - 请查看:http://code.google.com/p/csexwb2/

    我在 生产环境 产品中使用过它 . 这是非常好的,有很好的演示虽然现在似乎没有像过去那样得到维护 .

  • 2

    我使用过GeckoFX,它非常适合我 . 它使用Firefox引擎 . 我曾经遇到的唯一警告是,它在文档实际完全加载之前发出一次“DocumentLoaded”事件...我认为它在加载HTML时会发出一个,然后在所有加载时发出另一个图像和东西都加载了 . 我通过简单地忽略第一个来修复它,到目前为止它一直很好地工作 .

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

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

  • 14

    我尝试了一些Webkit变体,但根据我的经验,没有什么比OpenWebkitSharp具有的进步更好 . 喜欢它喜欢它.. HTML5和CSS3分数尽可能接近谷歌Chrome . 非常好的API和事件模型 . 如果您发现"not implemented" API很可能是因为它们未在Webkit中实现 . 其他一切都很棒 .

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

  • 11

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

    该库继承了Chromium的多进程架构 - 每个Web页面都在一个单独的Chromium进程中呈现,即使在插件崩溃或网页上发生任何其他意外错误之后,应用程序仍将继续工作 .

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

    查看API Reference了解更多详情 .

    下面的代码片段演示了如何创建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");
            }
        }
    }
    

    运行上面的示例后,您将获得以下输出:

    该图书馆是商业图书馆,但它可以免费用于开源和学术项目 . 商业许可证包括针对不同团队规模的支持包 . 也可以购买图书馆的源代码 .

    除了自己的页面,该组件在Visual Studio Marketplace中以NuGet packageVSIX package的形式提供 .

  • 0

    我遇到了同样的问题,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();
                }
    
  • 0

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

  • 150

    看一下Mono.WebBrowser控件 - 它将Gecko(由Firefox使用)或WebKit(由Safari使用)嵌入到WinForms中(不使用ActiveX) .

  • 2

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

相关问题