-
CefSharp 런타임 에러가 발생 하는 이유, Any CPU로 했을 때도 문제 없이 되게 하는 방법기타 정보/정보공유-IT 2023. 2. 1. 14:05반응형
비주얼 스튜디오에서 C# Winform 프로젝트를 예로 들면, 프로젝트에 웹브라우저를 크로미움으로 쓴다면 누겟에서 CefSharp 패키지를 설치하는 것은 필연적으로 해야 하는 일이다.
그렇게 프로젝트에 CefSharp 관련 라이브러리들을 사용한 코드들을 완성하고 빌드를 하려고 하는데 빌드가 되지 않거나 런타임 에러가 발생하는 경우가 있다.
에러 메시지는 다음과 같이 두 가지 중에 하나가 나올 것이다.
System.IO.FileNotFoundException: '파일이나 어셈블리 'CefSharp.Core.Runtime, Version=96.0.180.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 지정된 파일을 찾을 수 없습니다.'
CefSharp.Common is unable to proceeed as your current PlatformTarget is 'AnyCPU'.
에러 메시지가 첫 번째와 같은 경우만 나오는 경우에는 무엇이 문제인지 명확이 알 수 없지만 만약 에러 메시지가 두 번째와 같이 나온다면 무슨이유에서인지 알 수 있게 된다.
즉, CefSharp 패키지는 32비트와 64비트를 나눠서 빌드가 되어 있어서 프로젝트 속성에서 빌드 구성이 플랫폼 대상을 AnyCPU로는 빌드가 될 수가 없다.
32비트 기본 사용에 체크하거나
플랫폼 대상에서 x86이나 x64를 선택하거나
플랫폼 대상을 32비트로 할 것인지, 64비트로 할 것인지 선택해서 빌드를 하면 해결 될 수 있다.
그런데 플랫폼 대상을 Any CPU로 설정 할 수 있는 방법이 정말 없는 걸까?
Any CPU로 했을 때도 CefSharp 에러 문제 없이 빌드 되게 하는 방법
1)
.csproj 파일에서
<BootstrapperEnabled>true</BootstrapperEnabled> 밑에
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>를 추가한다.2)
메인이 되는 생성자에 이벤트를 추가한다.
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { if (args.Name.StartsWith("CefSharp")) { string assemblyName = args.Name.Split(new[] { ',' }, 2)[0] + ".dll"; string architectureSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, Environment.Is64BitProcess ? "x64" : "x86", assemblyName); return File.Exists(architectureSpecificPath) ? Assembly.LoadFile(architectureSpecificPath) : null; } return null; }
3)
Cef.Initialize(); 전에 Cef 설정 중 BrowserSubprocessPath에 대한 것을 추가 한다.
CefSettings settings = new CefSettings(); settings.BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, Environment.Is64BitProcess ? "x64" : "x86", "CefSharp.BrowserSubprocess.exe"); Cef.Initialize(settings);
빌드를 하면 문제 없이 잘 됨을 알 수 있을 것이다
반응형'기타 정보 > 정보공유-IT' 카테고리의 다른 글