카테고리 보관물: C#

C#

Chrome과 같은 더 나은 브라우저로 .NET WebBrowser 컨트롤을 대체 하시겠습니까? 버전처럼 보이는 것을 제외하고는

최신 브라우저를 .NET 응용 프로그램에 삽입하는 비교적 쉬운 방법이 있습니까?

지금까지 내가 이해하는 한, WebBrowser컨트롤에 대한 래퍼입니다 IE 는 매우 이전 버전처럼 보이는 것을 제외하고는 문제가되지 않을 것이다, IE 모두와 함께, CSS 나사 업, 잠재적 인 보안 위험의 측면에서 수반 (렌더링 엔진이 패치되지 않은 경우, 실제 버퍼 오버 플로우 문제가 해결 될 것으로 기대할 수 있습니까?) 및 기타 문제.

내가 사용하고 비주얼 스튜디오 C #을 (익스프레스 에디션 – 그것은 여기에 어떤 차이가 있습니까?)

좋은 웹 브라우저를 내 응용 프로그램에 통합하고 싶습니다. 일부에서는 사용자 등록 프로세스를 처리하고 웹 사이트의 일부 기능과 다른 순서와의 인터페이스를 처리하는 데 사용하지만 더 많은 오류가 필요한 제어를 필요로하는 다른 응용 프로그램이 있습니다.

나는 필요하다:

  • 내 응용 프로그램의 창 안에 통합 할 수있는 브라우저 (별도의 창이 아님)
  • 최신 브라우저와 동등한 CSS, js 및 기타 웹 기술 지원
  • “탐색”, “뒤로”, “다시로드”와 같은 기본 브라우저 기능 …
  • 페이지 코드 및 출력에 대한 자유 액세스.

Chrome은 BSD 라이센스하에 있기 때문에 Chrome에 대해 생각했지만 최신 버전의 IE에 만족할 것입니다.

가능한 한 간단하게 유지하고 싶습니다. 기존 WebBrowser컨트롤을 패치 할 수 있다면 가장 좋을 것입니다.이 컨트롤은 이미 필요한 것의 약 70 %를 수행하지만 가능하지 않다고 생각합니다.

Mozilla에 대한 activeX 컨트롤 ( http://www.iol.ie/~locka/mozilla/control.htm ) 을 찾았 지만 이전 버전 인 것 같으므로 반드시 개선 된 것은 아닙니다.

나는 제안에 개방적이다



답변

Checkout CefSharp .Net 바인딩, 커뮤니티에서 고맙게 받아 들인 멋진 프로젝트로 돌아 오기 시작한 프로젝트.

이 프로젝트는 Chromium Embedded Framework를 감싸고 있으며 Rdio의 Windows 클라이언트, Windows 용 Facebook Messenger 및 Windows 용 Github를 비롯한 여러 주요 프로젝트에서 사용되었습니다.

WPFWinforms에 대한 브라우저 제어 기능을 갖추고 있으며 수많은 기능과 확장 점이 있습니다. Chromium을 기반으로하므로 엄청나게 빠릅니다.

NuGet에서 가져 오십시오. Install-Package CefSharp.Wpf또는Install-Package CefSharp.WinForms

예를 확인하고 의견 / 피드백 / 풀 요청을 제공하십시오 : https://github.com/cefsharp/CefSharp

BSD 라이센스


답변

모르는 경우 Chrome에서 웹킷을 사용하며 Safari에서도 사용됩니다. 같은 맥락의 몇 가지 질문이 있습니다.

웹 키트 하나는 다른 답변 상태가 좋지 않으므로 한 버전은 더 이상 작동하지 않으며 (Google 코드 1) 모노 버전은 실험적입니다. 누군가가 괜찮은 .NET 래퍼를 만들려고 노력했다면 누군가가하고 싶지 않은 것 같습니다. 이제 HTML5 및 IE (8 ) 엔진이 부족합니다.

업데이트 (2014)

Awesomium 이라는 .NET 애플리케이션에 Chrome을 포함 할 수있는 새로운 이중 라이센스 프로젝트가 있습니다 . .NET API와 함께 제공되지만 렌더링에는 꽤 많은 해킹이 필요합니다 (이 예제에서는 브라우저 창을 버퍼로 가져와 버퍼를 이미지로 페인트하고 타이머에서 새로 고침).

나는 이것이 Battlefield 3에서 Origin이 사용하는 브라우저 라고 생각 합니다.

업데이트 (2016)

지금이 DotnetBrowser , Awesomium에 상업 대안은. Chromium을 기반으로합니다.


답변

나는 며칠 동안 C # 웹 브라우저 구성 요소에 대한 대안을 테스트 해 왔으며 여기 내 목록이 있습니다.

1. 최신 IE 버전 8,9 사용 :

웹 브라우저 구성 요소가 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 프로젝트를 기반으로하는 웹킷 엔진을위한 .net 래퍼입니다. WebKit은 Chrome / Safari에서 사용하는 레이아웃 엔진입니다.

장점 :

  • 적극적으로 개발
  • HTML5 / CSS3 지원

단점 :

  • 구현되지 않은 많은 기능
  • x64를 지원하지 않습니다 (x86 용으로 앱을 빌드해야 함)

많은 기능이 아직 구현되지 않았지만 OpenWebKit은 꽤 훌륭합니다 .Visual Studio에서이를 사용하여 null 개체 참조를 throw 한 다음 디자인 모드에서 몇 가지 문제가 발생했습니다. 그것을 사용하는 사람은 거의 즉시 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̶6̶)

GeckoFX는 WinForms 응용 프로그램에 포함하기위한 크로스 플랫폼 Webrowser 컨트롤입니다. Windows에서는 .NET, Linux에서는 모노와 함께 사용할 수 있습니다. Gecko는 Firefox에서 사용하는 레이아웃 엔진입니다.

GeckoFX가 적극적으로 개발되지 않았다는 정보는 거의 없었습니다. 물론 Firefox보다 항상 1-2 버전이지만 실제로는 활동과 컨트롤 자체에 깊은 인상을 받았습니다. 필요한 모든 작업을 수행하지만 실행하는 데 약간의 시간이 필요했습니다. 실행하려면 약간의 자습서가 있습니다.

  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에 복사하십시오 (또는 프로젝트가 릴리스로 설정된 경우 릴리스).
  6. 양식의 Visual Studio 디자이너로 이동하고 도구 상자로 이동하여 내부를 마우스 오른쪽 버튼으로 클릭-> 항목 선택-> 찾아보기-> 다운로드 한 GeckoFX winforms dll 파일 찾기-> 확인
  7. 이제 새로운 제어 GeckoWebBrowser가 있어야합니다.

실제로 Chrome을 사용해야하는 경우 Awesomium 이라는이 제품을 살펴보십시오. 비상업적 프로젝트에는 무료이지만 라이센스는 수천 달러입니다.


답변

나는 같은 문제가 있었다 .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

답변

레지스트리를 사용하여 웹 브라우저 제어를위한 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


답변

Mono.WebBrowser 컨트롤을 살펴보십시오 -Firefox 에서 사용하는 Gecko 또는 Safari에서 사용하는 WebKit을 WinForms에 포함합니다 (ActiveX를 사용하지 않음).


답변

나는 이것이 ‘바꾸기’웹 브라우저 컨트롤이 아니라는 것을 알고 있지만 레이아웃 등을 위해 BootStrap 3 +를 사용하는 페이지를 표시하는 동안 약간의 렌더링 문제가 있었으며 다음을 사용하도록 제안하는 게시물을 찾았습니다. 분명히 그것은 IE에만 ​​해당되며 렌더링을 위해 클라이언트 컴퓨터에서 발견 된 최신 변형을 사용하도록 지시합니다 (따라서 IE7은 기본값이라고 생각하지 않습니다)

그냥 넣으십시오 :

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

문서의 머리 부분에 있습니다.

물론 문서가 아니라면 분명히 도움이되지는 않습니다 (웹 브라우저 컨트롤을 통해 자신이 만들지 않은 페이지를 읽는다면 개인적으로 보안 구멍이라고 생각하지만 웹 브라우저를 사용하는 이유는 무엇입니까?)

행운을 빕니다.