是否有相对简单的方法将现代浏览器插入到。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),但它看起来像是一个旧版本,所以它不一定是一个改进。

我愿意听取建议


当前回答

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

所以只要写:

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

在文档头部的某个地方。

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

其他回答

2020年7月更新

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

2018年5月更新

如果您希望应用程序在Windows 10或更高版本上运行,那么现在可以使用Windows Community Toolkit将Edge浏览器嵌入到. net应用程序中。

WPF示例:

Install Windows Community Toolkit Nuget Package Install-Package Microsoft.Toolkit.Win32.UI.Controls XAML Code <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> CS Code: 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"));
  }
}

请参考此链接了解更多信息。

我也遇到了同样的问题,网络浏览器使用的是旧版本的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

最近几天,我一直在测试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是一个基于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̶t e s̶̶n̶”̶̶̶s̶u p p̶̶̶o̶r t̶̶̶x̶6̶4̶̶(̶A p p̶̶̶̶m̶美国̶̶t̶̶b̶e̶̶b̶u̶i t̶l̶̶̶f̶o̶r̶̶x̶8̶6面的̶)̶-看到comments

GeckoFX是一个跨平台Webrowser控件,用于嵌入到WinForms应用程序中。这可以在Windows上与. net一起使用,在Linux上与mono一起使用。 Gecko是Firefox使用的布局引擎。

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

Download GeckoFx-Windows-16.0-0.2, here you can check if newer is available GeckoFX Add references to two downloaded dll's Since GeckoFX is wrapper you need XulRunner, go to Version List to see which one you need Now that we know which version of XulRunner we need, we go to Mozilla XulRunner releases, go to version folder -> runtimes -> xulrunner-(your_version).en-US.win32.zip, in our case xulrunner-16.0.en-US.win32.zip Unzip everything and copy all files to your bin\Debug (or release if your project is set to release) Go to visual studio designer of your form, go to toolbox, right click inside -> Choose items -> Browse -> Find downloaded GeckoFX winforms dll file -> OK Now you should have new control GeckoWebBrowser

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

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

用c#嵌入Webkit 用c#嵌入Gecko (Firefox引擎)

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

更新(2014)

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

我想这是Origin在《战地3》中使用的浏览器。

更新(2016)

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

您可以使用注册表来设置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