본문 바로가기
개발언어/.NET

WPF Chrome Browser Embedding 처리

by 공장장코난 2018. 10. 29.
WPF 또는 WinForm에서 Application 개발시 기존 VisualStuido 도구상자의 WebBrowser 연동, 요즘 개발된 Site에서 URL 연결시 script 오류가 빈번하게 발생한다. 이에 Web을 별도 개발하여 연동하는 번거로움이 있었다. 물론 Java script 오류를 안보이게 처리할 수 있지만 Web에서의 정상 동작은 기대할 수 없다. 하지만 CefSharp를 통해 Chrome engine 연동으로 왠만한 페이지를 link Application상에서 연동 시킬수 있다.


*javascript 오류 제거


연동방법
Step1 - NuGet패키지 관리자에서 CefSharp.Wpf 설치
Ex) 콘솔에서 설치
PM> Install-Package CefSharp.Wpf -Version 67.0.0
Ex) NuGet PackageManager에서 설치
검색 Keyword CefSharp.Wpf


주의사항
컴파일시 플랫폼 대상을 x86 또는 x64로 선택 후 컴파일 실행해야 하며, 적용하지 않을 경우 아래 오류가 발생

나의 경우엔 x86으로 개발하므로 프로젝트 속성, 빌드 탭의 플랫폼 대상을 x86으로 설정, 빌드 구성관리자에 x86을 추가 한다.




Code
xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"  <-- 추가
...
<Grid>
    <wpf:ChromiumWebBrowser x:Name="ChromeBrowser"
                            Address="http://www.google.com"/>
</Grid>

*주의할 점은 NeGet PackageManager를 통해 CefSharp를 통해 필요한 library를 추가 적용하였지만, 여전히 wpf UI Preview 화면은 잘못된 태그로 인해 Page 오류가 발생하며, Code에서는 ChromeBrowser 네임스페이스를 찾을 수 없다는 오류가 발생한다. 
이때 그냥 무시하고 Complie 후 실행해도 정상 동작 한다.





컴파일 후 실행 화면




 

Quick Start Guide


CefSharp WPF Application 실행 오류 처리

개발시에는 CefSharp를 연동한 WPF Application은 정상 동작하였으나, 배포한 PC에서는 실행되지 않은 현상이 발생한다. 이벤트 뷰어의 응용 프로그램 로그를 확인한 결과 아래 오류를 확인할 수 있다.


Application Error

오류 있는 응용 프로그램 이름: ChromeEmbeddingExamApp.exe, 버전: 1.0.0.0, 타임스탬프: 0xbd4af365
오류 있는 모듈 이름: KERNELBASE.dll, 버전: 10.0.17134.319, 타임스탬프: 0x5ea0e53d
예외 코드: 0xe0434352
오류 오프셋: 0x001117d2
오류 있는 프로세스 ID: 0x15f8
오류 있는 응용 프로그램 시작 시간: 0x01d46a72f74ddc3e
오류 있는 응용 프로그램 경로: C:\Users\win10\Desktop\Debug\ChromeEmbeddingExamApp.exe
오류 있는 모듈 경로: C:\WINDOWS\System32\KERNELBASE.dll
보고서 ID: 5b3bb9cc-f272-4b8c-85e6-48dd42c4e0d8
오류 있는 패키지 전체 이름:
오류 있는 패키지에 상대적인 응용 프로그램 ID:

.NET Runtime
응용 프로그램: ChromeEmbeddingExamApp.exe
Framework 버전: v4.0.30319
설명: 처리되지 않은 예외로 인해 프로세스가 종료되었습니다.
예외 정보:System.IO.FileNotFoundException
   위치: CefSharp.Wpf.ChromiumWebBrowser.NoInliningConstructor()
   위치: CefSharp.Wpf.ChromiumWebBrowser..ctor()

예외 정보:System.Windows.Markup.XamlParseException
   위치: System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
   위치: System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
   위치: System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
   위치: System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext)
   위치: System.Windows.Application.LoadComponent(System.Uri, Boolean)
   위치: System.Windows.Application.DoStartup()
   위치: System.Windows.Application.<.ctor>b__1_0(System.Object)
   위치: System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   위치: System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   위치: System.Windows.Threading.DispatcherOperation.InvokeImpl()
   위치: System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
   위치: MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)
   위치: System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   위치: System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   위치: System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   위치: MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
   위치: System.Windows.Threading.DispatcherOperation.Invoke()
   위치: System.Windows.Threading.Dispatcher.ProcessQueue()
   위치: System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   위치: MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   위치: MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   위치: System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   위치: System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   위치: System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   위치: MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   위치: MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   위치: System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   위치: System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   위치: System.Windows.Application.RunDispatcher(System.Object)
   위치: System.Windows.Application.RunInternal(System.Windows.Window)
   위치: System.Windows.Application.Run(System.Windows.Window)
   위치: System.Windows.Application.Run()
   위치: ChromeEmbeddingExamApp.App.Main()



해결책은 아래 stackoverflow 에서 힌트를 찾아서 해결하였는데 원인은 VC++ 재배포 패키지를 설치하지 않아 발생한 현상이다. 아래 경로에서 vc_redist.x86.exe를 다운받아 설치 정상 동작됨을 확인할 수 있었다. (현재 CefSharp 버전이 67 이상이므로 2013보다 2015가 올바르게 동작됨)

https://stackoverflow.com/questions/44848820/cefsharp-wpf-error


VC++ 재배포 패키지 다운로드

https://www.microsoft.com/ko-kr/download/details.aspx?id=48145