C# - chromiumembedded 사용
WebKit이 Java Applet과의 충돌을 일으키므로,
C# - WebKit.NET 사용
; https://www.sysnet.pe.kr/2/0/1456
다음 대안을 찾아보았습니다. 오호~~~ 마침 Chromium을 내장 컨트롤로 감싸주는 프로젝트가 있군요. ^^
chromiumembedded
; http://code.google.com/p/chromiumembedded/
C/C++은 당연히 chromiumembedded 프로젝트 자체가 지원되겠고, 위의 사이트에서 "External Projects"를 보면 .NET, Mono, Delphi, Java, Python에서 추가지원을 하고 있으니 왠지 WebKit보다 더욱 신뢰가 갑니다. ^^
그럼, .NET 에 대한 지원을 한번 볼까요?
CefSharp - Embedded Chromium for .Net
; https://github.com/chillitom/CefSharp#readme
CefSharp-master.zip 소스 코드는 Visual Studio 2012를 지원하지 않으므로 제 경우에는 별도로 브랜치된 다음의 버전을 다운로드를 받았습니다.
.Net binding for the Chromium Embedded Framework - vs2012 branch
; https://github.com/perlun/CefSharp/tree/vs2012
압축해제하고 Visual Studio 2012에 로드하면 다음과 같은 프로젝트들이 보입니다.
- CefSharp
- CefSharp.Example
- CefSharp.Test
- CefSharp.WinForms
- CefSharp.WinForms.Example
- CefSharp.WinForms.Test
- CefSharp.Wpf
- CefSharp.Wpf.Example
- CefSharp.Wpf.Test
이 중에서 테스트 프로젝트 제외하고, WinForm으로 한정지으면 다음과 같이 정리됩니다.
- CefSharp
- CefSharp.Example
- CefSharp.WinForms
- CefSharp.WinForms.Example
다시 예제 프로젝트를 제외하면 최종적으로 다음과 같이 정리됩니다.
- CefSharp: C++/CLI, libcerf.dll을 매개로 Chromium과 연동
- CefSharp.WinForms: C++/CLI, CefSharp 프로젝트를 매개로 윈폼용 WebView 컨트롤 구현
그리고 Chromium 관련 네이티브 DLL 들이 압축 파일의 .\CefSharp-vs2012\Release 폴더에 있는데 이 DLL들이 EXE와 함께 배포되어야 합니다.
자... ^^ 그럼 이제 x86 Windows Forms 프로젝트를 하나 생성시키고, CefSharp의 chromium 관련 네이티브 DLL 들을 프로젝트에 복사하고 Embed시킵니다.
(주의: locales 폴더 내의 파일들도 "Copy if newer"로 설정)
편의상, 프로젝트 설정에서 "Debug" / "Enable the Visual Studio hosting process"옵션을 해제합니다.
그 후로는 일반적인 컨트롤 사용하는 것과 별반 다르지 않게 제어할 수 있습니다.
using System;
using System.ComponentModel;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
WebView _webView;
BrowserSettings _settings = new BrowserSettings();
private void Form1_Load(object sender, EventArgs e)
{
_webView = new WebView("https://www.sysnet.pe.kr", _settings);
this.Controls.Add(_webView);
_webView.Dock = DockStyle.Fill;
}
}
}
그럼, 다음과 같이 잘 실행됩니다. ^^
URL을 전달하는 것은 생성자에서도 가능하지만, 별도로 Load 메소드가 제공되는데요. 주의할 점은 반드시 "초기화"된 후에만 정상적으로 호출할 수 있으므로 다음과 같은 식으로 초기화 되었음을 확인해 주어야 합니다.
if (_webView.IsBrowserInitialized == true)
{
_webView.Load("https://www.sysnet.pe.kr");
}
첨부된 파일은 위의 예제를 포함합니다.
그 외에, JRE만 설치하면 Java Applet도 잘 동작합니다. Flash의 경우에는 아래의 경로에서 배포되는 "Flash Player 11 for Other Browsers"를 설치하는 경우 역시 잘 동작합니다.
다른 버전의 Adobe Flash Player 설치
; http://get.adobe.com/kr/flashplayer/otherversions/
참고로, Java Applet의 경우 JRE 7과 연동하는 경우 충돌이 발생하는 현상은 여전합니다.
Visual Studio 2013의 경우 CefSharp, CefSharp.WinForms 프로젝트를 컴파일하는 경우 다음과 같은 빌드 오류가 발생할 수 있습니다.
LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1800' in AssemblyInfo.obj
해법은 아래의 글에서처럼,
error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj
; http://stackoverflow.com/questions/19575747/error-lnk2038-mismatch-detected-for-msc-ver-value-1600-doesnt-match-valu
개별 프로젝트의 "Platform Toolset" 설정을 이전 v100 버전으로 맞춰주어야 합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]