.NET WebBrowser 컨트롤을 Chrome과 같은 더 나은 브라우저로 대체하시겠습니까?
최신 브라우저를 .NET 응용 프로그램에 비교적 쉽게 삽입할 수 있는 방법이 있습니까?
로는 제가이해바는로는하,는바로▁the▁as는해하▁under,WebBrowser
제어는 IE를 위한 래퍼로, CSS 오류, 잠재적인 보안 위험(렌더링 엔진이 패치되지 않았다면 수십억 개의 버퍼 오버플로 문제가 해결될 것으로 기대할 수 있습니까?) 및 기타 문제와 관련하여 매우 오래된 버전의 IE처럼 보인다는 점을 제외하고는 문제가 되지 않습니다.
저는 Visual Studio C#(익스프레스 에디션 - 여기서 차이가 있습니까?)를 사용하고 있습니다.
좋은 웹 브라우저를 애플리케이션에 통합하고 싶습니다.어떤 경우에는 사용자 등록 프로세스, 웹 사이트의 일부 기능 및 기타 순서를 처리하는 데 사용하기도 하지만, 더 많은 오류가 필요한 다른 응용 프로그램을 염두에 두고 있습니다.통제.
필요한 항목:
- 별도의 창이 아닌 내 응용프로그램의 창 내에서 통합할 수 있는 브라우저
- CSS, js 및 기타 웹 기술을 최신 브라우저와 동등하게 지원합니다.
- 기본 브라우저 기능은 "탐색", "뒤로", "다시 로드"...
- 페이지 코드 및 출력에 자유롭게 액세스할 수 있습니다.
Chrome은 BSD 라이센스에 포함되어 있기 때문에 생각하고 있었습니다만, 최근 버전의 IE에도 만족하고 싶습니다.
저는 가능한 한 일을 단순하게 하고 싶습니다.기존 제품을 패치할 수 있는 것이 가장 좋습니다.WebBrowser
제가 필요로 하는 것의 약 70%를 이미 처리하고 있는 제어 장치입니다. 하지만 그것은 불가능할 것 같습니다.
Mozilla용 액티브X 컨트롤(http://www.iol.ie/ ~locka/slock/control.htm)을 찾았지만 이전 버전인 것처럼 보여 반드시 개선된 것은 아닙니다.
나는 제안을 받아들일 수 있습니다.
CefSharp를 확인하십시오.네트 바인딩은 제가 얼마 전에 시작한 프로젝트로, 고맙게도 지역사회에 의해 받아들여져 멋진 것으로 변했습니다.
이 프로젝트는 크롬 임베디드 프레임워크를 포장하고 Rdio의 Windows 클라이언트, Windows용 Facebook Messenger 및 Windows용 Github을 포함한 여러 주요 프로젝트에 사용되었습니다.
WPF 및 Winforms에 대한 브라우저 제어 기능이 있으며 수많은 기능과 확장 지점이 있습니다.크롬을 기반으로 하기 때문에 물집이 생길 정도로 빠릅니다.
: NuGet 파일:dotnet add package CefSharp.Wpf
또는dotnet add package CefSharp.WinForms
예시를 확인하고 당신의 생각/의견/의견을 제시하세요: https://github.com/cefsharp/CefSharp
BSD 라이센스 취득
Chrome은 사용자가 몰랐다면 Safari에서도 사용되는 웹킷을 사용합니다.다음은 같은 맥락의 몇 가지 질문입니다.
웹킷 하나는 다른 답변처럼 훌륭하지 않습니다. 한 버전은 더 이상 작동하지 않습니다(구글 코드 하나). 모노 버전은 실험적입니다.누군가가 그것을 위해 괜찮은 .NET 래퍼를 만들기 위해 노력했다면 좋겠지만, 그것은 아무도 하고 싶어하지 않는 것처럼 보이는 것은 아닙니다. 이것이 현재 HTML5와 IE(8) 엔진이 부족한 많은 다른 기능들을 지원한다는 것을 고려할 때 놀라운 일입니다.
업데이트(2014)
크롬을 닷넷 애플리케이션에 내장할 수 있는 새로운 듀얼 라이선스 프로젝트인 Awesomium이 있습니다..NET API와 함께 제공되지만 렌더링을 위해 꽤 많은 해킹이 필요합니다(예: 브라우저 창을 버퍼로 끌어다 놓고 버퍼를 이미지로 칠하고 타이머에서 새로 고침).
이것은 배틀필드 3에서 오리진이 사용하는 브라우저인 것 같습니다.
업데이트(2016)
이제 Awesomium의 상업적 대안인 Dotnet Browser가 있습니다.크롬을 기반으로 합니다.
저는 며칠 전부터 C# 웹 브라우저 구성 요소에 대한 대안을 테스트해 왔으며 다음은 제 목록입니다.
최신 IE 버전 8,9 사용:
웹 브라우저 구성 요소가 IE8이 아닌 IE7입니까?어떻게 바꿀까요?
찬성:
- 운영에 필요한 작업이 많지 않음
- IE9인 경우 일부 HTML5/CSS3 지원, IE10인 경우 전체 지원
단점:
- 대상 컴퓨터에 대상 IE 버전이 설치되어 있어야 합니다. IE10은 여전히 Win7에서 미리 보기 중입니다.
IE9에는 최고의 CSS3 및 HTML5 기능이 일부 부족하지만 이를 위해 많은 작업이 필요하지 않고 HTML5 및 CSS3 지원을 받을 수 있습니다.하지만 IE10도 같은 방식으로 실행할 수 있을 것입니다.문제는 대상 시스템이 IE10을 설치해야 한다는 것이고, 윈도우 7에서 아직 미리 보기 중이기 때문에 반대하는 것을 제안합니다.
OpenWebKitSharp는 웹킷 기반 웹킷 엔진의 .net 래퍼입니다.NET 0.5 프로젝트.WebKit는 Chrome/Safari에서 사용하는 레이아웃 엔진입니다.
찬성:
- 적극적으로 개발됨
- HTML5/CSS3 지원
단점:
- 많은 기능이 구현되지 않음
- x64를 지원하지 않음(앱은 x86용으로 구축되어야 함)
OpenWebKit은 많은 기능이 아직 구현되지 않았지만 비주얼 스튜디오에서 사용하는 데 몇 가지 문제가 발생하여 null 객체 참조가 발생한 후 설계 모드에서 몇 가지 js 문제가 발생했습니다.그것을 사용하는 모든 사람들은 거의 즉시 js 경보가 아무것도 하지 않는다는 것을 알아차릴 것입니다.마우스 업, 마우스 다운 같은 이벤트들...등이 작동하지 않습니다. JS 드래그 앤 드롭은 버그가 있습니다.
저도 VC 재배포 가능한 특정 버전이 설치되어야 하기 때문에 설치하는 데 어려움이 있어서 예외적으로 이벤트 로그를 보고 VC 버전을 찾아서 설치했습니다.
게코 FX
찬성:
- 모노에 대한 작업
- 적극적으로 개발됨
- HTML5/CSS3 지원
단점:
- D̶o̶e't̶t̶s̶u̶p̶p̶o̶r̶t̶x̶6̶4̶(̶A̶p̶p̶mu̶s̶t̶̶ ̶b̶u̶i̶l̶t̶f̶of̶orr̶8̶6̶) - 아래 주석 참조
GeckoFX는 WinForms 애플리케이션에 내장하기 위한 크로스 플랫폼 웹 브라우저 컨트롤입니다.윈도우즈의 .NET 및 리눅스의 mono와 함께 사용할 수 있습니다.Gecko는 Firefox에서 사용하는 레이아웃 엔진입니다.
GeckoFX가 적극적으로 개발되지 않았다는 정보를 몇 가지 접했는데, 이는 사실이 아닙니다. 물론 항상 파이어폭스보다 한두 버전 뒤지지만 정상적인 것입니다. 활동과 제어 자체에 정말 감명받았습니다.필요한 모든 기능을 제공하지만 실행할 시간이 필요했습니다. 실행을 위한 작은 튜토리얼은 다음과 같습니다.
- GeckoFx-Windows-16.0-0.2 다운로드, 여기에서 최신 GeckoFX를 사용할 수 있는지 확인할 수 있습니다.
- 다운로드한 두 개의 DLL에 참조
- GeckoFX는 래퍼이므로 XulRunner가 필요합니다. 버전 목록으로 이동하여 필요한 것을 확인하십시오.
- 이제 어떤 버전의 XulRunner가 필요한지 알았으므로 Mozilla XulRunner 릴리스로 이동하고 버전 폴더 -> runtimes -> xulrunner-(your_version).en-US.win32.zip(xulrunner-16.0.en-US.win32.zip)으로 이동합니다.
- 모든 파일의 압축을 풀고 모든 파일을 bin\Debug에 복사합니다(또는 프로젝트가 릴리스되도록 설정된 경우 릴리스).
- 양식의 비주얼 스튜디오 디자이너로 이동하여 도구 상자에서 마우스 오른쪽 단추로 내부 -> 항목 선택 -> 찾아보기 -> 다운로드한 GeckoFX winforms dll 파일 찾기 -> 확인
- 이제 새로운 컨트롤 Gecko WebBrowser가 있어야 합니다.
크롬을 꼭 사용해야 한다면, Awesomium이라고 불리는 이 제품을 보세요. 비상업적인 프로젝트에는 무료이지만, 상업적인 프로젝트에는 수천 달러의 라이센스가 있습니다.
저도 같은 문제가 있었습니다. 웹 브라우저가 이전 버전의 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
2020년 7월 업데이트
크롬 기반 웹뷰 2는 마이크로소프트에서 출시되었습니다.이제 새로운 Cromium Edge 브라우저를 .NET 응용 프로그램에 포함할 수 있습니다.
2018년 5월 업데이트
Windows 10 이상 버전에서 실행할 응용 프로그램을 대상으로 하는 경우 Windows Community Toolkit을 사용하여 .NET 응용 프로그램에 Edge 브라우저를 포함할 수 있습니다.
WPF 예:
Windows Community Toolkit Nuget 패키지 설치
Install-Package Microsoft.Toolkit.Win32.UI.Controls
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>
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"));
}
}
자세한 내용은 이 링크를 참조하십시오.
레지스트리를 사용하여 웹 브라우저 제어를 위한 IE 버전을 설정할 수 있습니다.이동: HKLM\SOFTWARE\Microsoft\로 이동합니다.Internet Explorer\기본\기능 제어\FEATURE_BROWSER_EMUTION 및 browser_module 값을 사용하여 "yourApplicationName.exe"를 추가합니다. browser_module 값을 보려면 http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation 링크하십시오. http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation
이것이 '대체' 웹 브라우저 컨트롤이 아니라는 것을 알지만 레이아웃 등에 BootStrap 3+를 사용하는 페이지를 보여주는 동안 몇 가지 끔찍한 렌더링 문제가 발생했고, 다음을 사용하도록 제안하는 게시물을 발견했습니다.분명히 IE에 특화되어 있으며 렌더링을 위해 클라이언트 머신에서 발견된 최신 버전을 사용하라고 합니다(그래서 IE7을 사용하지 않을 것입니다(기본값이라고 생각합니다).
그래서 다음과 같이 입력합니다.
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
문서의 머리 부분 어딘가에 있습니다.
사용자의 문서가 아니라면 도움이 되지 않을 것입니다. 개인적으로 웹 브라우저 컨트롤을 통해 직접 작성하지 않은 페이지를 읽는 경우에는 보안 구멍으로 간주합니다. 웹 브라우저를 사용하는 것이 어떨까요?
Geckofx와 Webkit.net 은 처음에는 둘 다 유망했지만, 인터넷 익스플로러가 발전함에 따라 각각 파이어폭스와 크롬에 대한 최신 정보를 제공하지 못했고, 웹 브라우저의 제어도 마찬가지였습니다.사용 중인 IE 버전에 관계없이 기본적으로 IE7처럼 동작하지만 레지스트리에서 HTML5를 허용하는 IE9로 변경하여 수정할 수 있습니다.
언급URL : https://stackoverflow.com/questions/790542/replacing-net-webbrowser-control-with-a-better-browser-like-chrome
'programing' 카테고리의 다른 글
별도의 줄에서 %path% 에코 (0) | 2023.05.28 |
---|---|
Xcode: 장치 지원 파일을 찾을 수 없습니다. (0) | 2023.05.28 |
Apache POI의 행 자동 크기 높이 (0) | 2023.05.28 |
"xcode-select-switch"를 설정한 후 Xcode가 작동을 중지함 (0) | 2023.05.28 |
WPF 창에서 유형별로 모든 컨트롤 찾기 (0) | 2023.05.28 |