Internet Explorer 기반 WPF WebBrowser 컨트롤에는 일부 키보드 및 포커스 문제 와 메모리 누수 문제가 있습니다 . 이러한 문제에 대한 대안으로 HTML 편집을 기반으로하는 WPF / C # 프로젝트에서 WebBrowser 컨트롤 대신 Chromium을 호스팅 할 수있는 옵션을 고려하고 있습니다. 비슷한 질문 한 질문 이전에 여기에. 답변을 읽고 자체 연구를 수행 했지만 실제로 프로덕션 품질 프로젝트에서 다음 옵션 중 하나를 사용한 사람들로부터 더 많은 피드백을 얻고 싶습니다 .
매우 적합 해 보이지만 프로젝트가 오픈 소스가 아니고 전체 소스를 쉽게 사용할 수 없다는 사실이 마음에 들지 않습니다. 또한 오프 스크린 렌더링은 우리가 실제로 의존하는 것이 아니기 때문에 프로젝트에 과도한 영향을 줄 수 있습니다.
CEF에 대한 CEF (Chromium Embedded Framework) 및 .NET 바인딩
아마도 현재 사용 가능한 최상의 옵션 일 것입니다. 이 프로젝트는 현재 Chrome v27과 동기화되어 살아 있고 활발한 것으로 보입니다. CEF3은 Chrome 다중 프로세스 아키텍처를 사용합니다. 또한 어도비가이를 지지 하는 것처럼 보인다 .
원래 목적은 IE 및 Firefox 용 HTML5 플러그인 이었지만 실제로는 독립 실행 형 ActiveX 컨트롤로도 작동하므로 WPF와 함께 사용하기 위해 랩핑 할 수 있습니다. 내부 웹 페이지 ( ) 와 상호 작용 하기에 충분한 API 를 제공합니다 onmessage, addEventListener/removeEventListener, postMessage
. Google이 Chrome 프레임 을 중단 한다는 것을 알고 있지만 소스가 Chromium 저장소에 남아 있다고 가정합니다. 최신 Chromium 코드로 업데이트하는 것은 어렵지 않으며이를 완벽하게 제어 할 수 있습니다.
크롬 기반이 아니며 V8 엔진을 사용하지 않으므로 실제로는 옵션이 아닙니다.
간과 한 다른 옵션이 있습니까?
실제 프로덕션 품질의 WPF 프로젝트를 위해 위의 옵션 중 하나를 사용하여 경험을 공유 한 사람이라면 대단히 감사하겠습니다. 통합, 라이센스 또는 배포 관련 사항이 있습니까? 감사합니다.
[편집 됨]
또한 관대 한 현상금 제안을 제공 하여이 질문에 도움 을 주신 artlung 에게 감사드립니다 .
답변
Chromium (CEF, Chrome Frame, Awesomium)을 임베드하는 데 가장 주목할만한 솔루션을 이미 나열했습니다. 더 이상 중요한 프로젝트가 없습니다.
거기에 여전히 버클륨의 프로젝트는 (참조 버클륨 샤프 와 버클륨은 관리 ),하지만 크롬의 이전 버전을 emebeds.
CEF 는 최선의 선택입니다. 완전히 공개 된 소스이며 자주 업데이트됩니다. 최신 버전의 Chromium을 포함 할 수있는 유일한 옵션입니다. Per Lundberg가 CEF 3을 CefSharp로 포팅하는 작업을 활발히 진행하고 있으므로 , 이것이 미래를위한 최선의 선택입니다. Xilium.CefGlue 도 있지만 CEF에 대한 저수준 API를 제공하며 CEF의 C API에 바인딩됩니다. 반면에 CefSharp는 CEF의 C ++ API에 바인딩됩니다.
Adobe는 CEF를 사용하는 유일한 주요 업체는 아닙니다 . CEF Wikipedia 페이지 에서 CEF를 사용하는 다른 주목할만한 응용 프로그램을 참조하십시오 .
답변
우리는 얼마 전에 똑같은 도전을했습니다. 우리는 WPF 기반이며 .NET 3.5를 지원하는 CEF3 오픈 소스 라이브러리를 사용하고 싶었습니다.
첫째, CEF의 저자는 여기 에 다른 언어에 대한 바인딩을 나열했습니다 .
둘째, 우리는 오픈 소스 .NET CEF3가 호출되는 바인딩 나서서 Xilium.CefGlue 과 함께 좋은 성공을 거두었 다. 예상대로 무언가 작동하지 않는 경우, 제작자는 일반적으로 내장 비트 버킷 추적기 에서 열린 문제에 매우 민감하게 반응합니다
지금까지 우리를 잘 섬겼습니다. Author는 최신 CEF3 릴리스 및 정기적 인 버그 수정을 지원하도록 라이브러리를 업데이트합니다.
답변
다른 하나는 다음과 같습니다.
http://www.essentialobjects.com/Products/WebBrowser/Default.aspx
이 엔진은 최신 Chrome 엔진을 기반으로하지만 CEF보다 사용하기가 훨씬 쉽습니다. 간단하게 참조하고 사용할 수있는 단일 .NET dll입니다.
답변
내가 속한 팀이 개발 한 DotNetBrowser 라이브러리를 살펴보십시오 . Chromium 기반 WPF 및 WinForms 브라우저 컨트롤을 제공하며 .NET 응용 프로그램에 포함하기가 매우 쉽습니다. HTML5, CSS3 및 JavaScript를 포함한 모든 최신 웹 표준을 지원합니다. 렌더링 된 페이지는 Chrome에서와 똑같이 보입니다.
라이브러리는 Chromium의 다중 프로세스 아키텍처를 상속합니다. 각 웹 페이지는 별도의 Chromium 프로세스로 렌더링되며 플러그인 충돌 또는 웹 페이지에서 기타 예기치 않은 오류가 발생한 후에도 응용 프로그램이 계속 작동합니다.
DotNetBrowser에서 제공하는 다른 유용한 기능은 다음과 같습니다. 이벤트로드 수신, 네트워크 활동 처리, 프록시 구성, 사용자 동작 시뮬레이션, 쿠키 작업, 쿠키 액세스 및 DOM, DOM 이벤트 수신, .NET에서 JavaScript 호출 가능 그 반대의 경우, 웹 페이지에서 웹 카메라 및 마이크를 사용하고 WebRTC 기반 통신을 설정하는 등의 작업을 수행하십시오 .
자세한 내용 은 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 패키지 및 VSIX 패키지 로 제공됩니다 .
답변
Awesomium.NET을 사용했습니다. 오픈 소스가 아니라는 점과 오래된 Webkit 렌더링 엔진을 사용한다는 사실은 마음에 들지 않지만 사용하기 쉽습니다. 그것은 내가 줄 수있는 유일한 보증에 관한 것입니다.
답변
답변
WPF RSS 리더에서도 동일한 문제가 발생했습니다. 원래 Awesomium (버전 1.6이라고 생각합니다) Awesomium이 훌륭합니다. 캐싱 (이미지 및 HTML 컨텐츠), JavaScript 실행, 다운로드 차단 등을 제어 할 수 있습니다. 또한 매우 빠릅니다. 프로세스 격리는 브라우저 충돌시 앱이 충돌하지 않음을 의미합니다.
그러나 그것은 무겁고 릴리스 빌드조차도 약 10-15MB (정확한 숫자를 기억할 수 없음)를 추가하므로 약간의 시작 페널티가 있습니다. 그런 다음 IE 브라우저 제어에서 발생하는 유일한 문제는 JavaScript 오류를 반복해서 발생한다는 것입니다. 그러나 다음 스 니펫으로 수정되었습니다.
XP 또는 Vista에서 앱을 거의 사용하지 않았지만 Win 7 이상에서는 IE 브라우저 컨트롤을 사용했기 때문에 충돌하지 않았습니다.
IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != null)
{
IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");
webBrowser;
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
if (webBrowser != null)
{
webBrowser.GetType().InvokeMember("Silent",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
}
}