466

是否有任何相对简单的方法可以将现代浏览器插入 .NET 应用程序?

据我了解,该WebBrowser控件是IE的包装器,这不会是一个问题,只是它看起来像是一个非常旧的版本IE,所有这些都涉及 CSS 错误、潜在的安全风险(如果渲染引擎没有打补丁,我真的可以期望修复无数的缓冲区溢出问题吗?),以及其他问题。

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

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

我需要:

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

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

尽可能地,我想保持简单。最好的办法是修补现有的WebBrowser控件,它已经完成了我需要的大约 70%,但我认为这是不可能的。

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

我愿意接受建议

4

8 回答 8

188

结帐CefSharp .Net绑定,这是我不久前开始的一个项目,幸运的是被社区接受并变成了一些很棒的东西。

该项目封装了Chromium Embedded Framework,并已在许多主要项目中使用,包括 Rdio 的 Windows 客户端、Windows 版 Facebook Messenger 和 Windows 版 Github。

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

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

查看示例并给出您的想法/反馈/pull-requests:https://github.com/cefsharp/CefSharp

BSD 许可

于 2010-12-03T17:42:50.643 回答
84

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

webkit 一个并不像其他答案所说的那样好,一个版本不再有效(谷歌代码一),而 Mono 一个是实验性的。如果有人努力为它制作一个体面的 .NET 包装器,那就太好了,但这似乎不是任何人都想做的事情——这令人惊讶,因为它现在支持 HTML5 和 IE(8 ) 引擎不足。

更新 (2014)

有一个新的双许可项目,允许您将 Chrome 嵌入到您的 .NET 应用程序中,称为Awesomium。它带有一个 .NET api,但需要一些技巧来渲染(示例将浏览器窗口绘制到缓冲区,将缓冲区绘制为图像并在计时器上刷新)。

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

更新(2016 年)

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

于 2009-04-26T09:24:55.787 回答
68

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

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

Web 浏览器组件是 IE7 不是 IE8?如何改变这个?

优点:

  • 运行它不需要太多工作
  • 如果 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 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 是一个跨平台的 Webbrowser 控件,用于嵌入到 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-美国.win32.zip
  5. 解压缩所有文件并将所有文件复制到您的 bin\Debug (如果您的项目设置为发布,则发布)
  6. 转到表单的Visual Studio Designer,转到工具箱,在里面单击右键->选择项目->浏览->查找下载的GeckoFX winforms dll文件->确定
  7. 现在你应该有新的控制 GeckoWebBrowser

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

于 2013-02-02T23:41:15.157 回答
49

我遇到了同样的问题,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
于 2015-12-30T23:16:39.983 回答
28

您可以使用注册表设置浏览器控制的 IE 版本。转到: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

于 2011-10-24T10:05:44.003 回答
21

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

所以只要放:

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

文档头部的某处。

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

于 2014-05-05T07:56:58.760 回答
18

2020 年 7 月更新

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

2018 年 5 月更新

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

WPF 示例:

  1. 安装 Windows 社区工具包 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. 客服代码:

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

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

于 2018-05-11T05:37:21.863 回答
1

Geckofx 和 Webkit.net 起初都很有前途,但是随着 Internet Explorer 的改进,它们并没有分别跟上 Firefox 和 Chrome有,但可以通过进入注册表并将其更改为允许 HTML5 的 IE9 来修复。

于 2013-08-07T21:24:32.560 回答