Первые шаги с Chromium Embedded Framework и .NET
Chromium Embedded Framework (CEF) — это проект с открытыми исходными кодами, созданный в 2008 году как элемент управления Web browser, работающий на базе Chromium от Google.
На данный момент это довольно мощный инструмент для разработки настольных приложений, со списком решений, использующих этот контрол можно ознакомиться здесь. Но достаточно сказать, что его используют такие широко известные продукты, как Evernote и Steam.
- CEF позволяет создать свои обработчики протоколов, таким образом, реализовать свой «закрытый» алгоритм шифрования (да-
да, несчастные пользователи старого Internet Explorer и корпоративных web-решений, долой ActiveX). Этим же можно воспользоваться, чтобы подгружать данные из статических ресурсов программы - CEF позволяет делать обертку над нативными функциями в пространстве объектов виртуальной машины Javascript. Ресурсоемкие операции по обработке больших массивов данных можно переложить на более строгие и быстрые языки программирования
- CEF позволяет обрабатывать события навигации, скачивания файлов и так далее
А теперь о грустном
Библиотека chromiumembedded, ссылка на которую давалась в начале статьи, реализована на C++. Но что делать, если Ваше решение уже работает на другом, управляемом языке программирования? Специально для нас существуют обертки для Java, Delphi, Python и .NET. Об использовании библиотеки CefSharp для .NET и пойдет речь.
Знакомьтесь, CefSharp
- Создание неограниченного числа компонентов класса WebView
- Обработка событий по загрузке страницы, события навигации
- Собственные обработчики протоколов.
- Внедрение js-кода во время выполнения страницы
- Создание глобальных [native code] объектов со статическими методами
public Window(string Url, CefSharp.BrowserSettings settings = null) < // . _Browser = new WebView(Url, settings ?? new CefSharp.BrowserSettings < DefaultEncoding = "UTF-8" >); _Browser.PropertyChanged += _Browser_PropertyChanged; // . > void _Browser_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) < if (e.PropertyName == "IsBrowserInitialized" && !isInitialized) doSomeStuff(); //и так далее >
Первое знакомство
Три главные вещи, которые нужны для работы — это локальный обработчик протокола, глобальный объект и тот объект, который будет у нас управлять фреймворком.
Локальный обработчик протокола
Реализуется пара классов: фабрика (реализует интерфейс CefSharp.ISchemeHandlerFactory) и, собственно, сам обработчик (реализующий интерфейс CefSharp.ISchemeHandler).
С первым все понятно:
public class LocalSchemeHandlerFactory : ISchemeHandlerFactory < public ISchemeHandler Create() < return new LocalSchemeHandler(); >>
Второй не будет сложнее:
public class LocalSchemeHandler : ISchemeHandler < // здесь могут быть свои конструкторы, личные методы класса и все остальное, что нужно для работы обработчика public bool ProcessRequest(IRequest request, ref string mimeType, ref Stream stream) < // через IRequest мы можем получить ссылку // в mimeType нужно правильно указать MIME-тип данных. Это необходимо, хотя Chromium сумеет и отличить text/javascript от text/plain или image/png // в Stream мы передаем поток, зачастую это - MemoryStream данных, что мы считали с жесткого диска или из локального хранилища return true; // в случае успешного получения данных. Иначе false >>
Для того, чтобы подключить js-файл приложения, можно воспользоваться методом GetStream или GetString класса ResourceManager. Из плюсов — исходный код вашего приложения будет находиться внутри .exe или .dll файла. Из минусов — при изменении js-кода придется каждый раз заново компилировать приложение.
Объект-мост между .NET и JS
С ним еще проще — это обычный объект, содержащий методы и поля. Один минус — на весь проект у Вас будет по одному экземпляру каждого такого класса.
Инициализация CEF
Я решил сделать класс наследником ApplicationContext. Для оконного отображения WinForms запускается быстрее, и нет необходимости тянуть за собой WPF
public class ApplicationController : ApplicationContext < protected DictionaryregisteredObjects; public ApplicationController(CefSharp.Settings settings = null) < registeredObjects = new Dictionary(); string resources = Path.Combine(Directory.GetCurrentDirectory(), "cache"); if (Directory.Exists(resources)) Directory.CreateDirectory(resources); CefSharp.CEF.Initialize(settings ?? new CefSharp.Settings() < Locale = "ru", CachePath = resources >); CefSharp.CEF.RegisterScheme("local", new LocalSchemeHandlerFactory()); registerJsObject("Form", new WindowObject()); // а здесь уже регистрируется объект-мост. > public void registerJsObject(string Name, object Object) < if (!registeredObjects.ContainsKey(Name)) < registeredObjects.Add(Name, Object); CefSharp.CEF.RegisterJsObject(Name, Object); >> >
На этом, собственно и все. Можно создавать форму, добавлять в нее компонент WebView и работать как душе угодно.
Если Вы дочитали до этого места, то Вы — терпеливый человек и я благодарен Вам.
Но нам этого мало
Как я уже отмечал ранее, в CefSharp есть некоторые недостатки. Например, нельзя связать компонент WebView с формой, его содержащую. Для этого родился некоторого рода жестокий костыль, который я представлю на обозрение публики.
Дабы не захламлять статью лоскутами кода, я приведу некоторые выдержки из листинга.
1 Новый класс Window, наследуемый от Form
- Он содержит подкласс FormEnumerator, который присваивает каждому окну свой уникальный строковый идентификатор и хранит ссылки на все объекты Window. По методу getWindowById можно получить форму.
- Статический метод JSInvoke, который получает вызов из среды браузера и вызывает функцию формы
- Метод CSInvoke, который вызывает метод среды JS из .NET
- Закрытый метод getFormRefrection, который создает «оболочку» для CLR методов формы. Строка формируется StringBuilder’ом на основании данных рефлексии. Выглядит это примерно так:
2 Объект-мост общих вызовов
Он выполняет операцию по вызову из JS в C#:
public class WindowObject < public string Invoke(string Id, string Method, string JSONData) < object x = JSON.JsonDecode(JSONData); if (x is ArrayList) < ArrayList y = (ArrayList)x; object[] args = new object[y.Count]; for (var i = 0; i < args.Length; i++) args[i] = y[i]; return JScripter.CreateString(Window.JSInvoke(Id, Method, args)); >else return JScripter.CreateString(Window.JSInvoke(Id, Method, new object[] < x >)); > public void Close(string Id) < Window.FormEnumerator.getWindow(Id).Close(); >>
Внимательный читатель заметит неладное: вместо нормальных объектов CefSharp позволяет обмениваться только простыми типами, такими как int, double, bool, string. Но в реальной жизни обычно, как раз, наоборот. Поэтому данный костыль использует упаковку/распаковку данных в JSON. Решение неидеальное, затрачивается множество времени зря, но таковы данные ограничения библиотеки.
Поскольку DataContractJsonSerializer работает только с определенными типами, его использовать проблематично. Поэтому в проекте был использован 100% managed парсер. Тоже костыль.
С кодом можете ознакомиться здесь.
Chromium Embedded Framework – интеграция настольных и Web технологий
Со времен появления Web технологий существовал практически единственный способ их использования – приложение Web-браузера в операционной системе. Развитие пользовательских настольных приложений и приложений для Web шло преимущественно независимо друг от друга. В какие-то моменты Web приложения постепенно вытесняли настольные приложения, развивая свои возможности за счет увеличения предлагаемого браузером API. И все же Web приложения редко становились настольными приложениями в привычном их понимании. Причиной тому – абстрагирование приложения в браузере от остальной системы и строгие политики безопасности браузера.
Интеграция Web в настольные приложения может дать разработчикам очень много дополнительных инструментов. В простейшем случае это банальное окно Web браузера внутри программы. В более сложных ситуациях это тесная безупречная интеграция лучших решений Web, не выделяющихся из общего настольного окружения. Решить весь спектр таких интеграционных задач разработчикам позволяет Chromium Embedded Framework (CEF).
[pullquote]Chromium Embedded Framework (CEF) – библиотека для разработчиков настольного ПО, позволяющая использовать в своих приложениях всевозможные Web технологии. Это путь к интеграции настольной экосистемы и Web.[/pullquote]
В одном из проектов Ауриги CEF изначально был применен взамен устаревших технологий. Это решение стало ключевым для дальнейшего плана развития проекта – интеграция С++ кода и Web технологий выросла на порядки. CEF используется не только в качестве простого встроенного Web браузера, но и для решения следующих задач:
- рендеринг текстов, HTML, растровой и векторной графики для дальнейшего использования изображений C++ кодом;
- совершенно бесшовная интеграция HTML редактора на языке Java Script в настольный интерфейс;
- интеграция системы помощи WebHelp;
- работа встроенного браузера с интегрированным в программу собственным Web сервером без открытия сетевых портов;
- пользовательские расширения С++ кода с помощью исполняемых JS скриптов, позволяющие расширять функционал программы сторонними разработчиками.
Таким образом нам удалось перевести часть С++ задач на более быстрый в разработке язык JS. Задачи по созданию контента для приложения тоже значительно упростились – появилась возможность делегировать их не только Web-разработчикам, но и дизайнерам, которые рисуют контент в SVG. Все это положительно сказалось на стоимости и времени разработки продукта, скорости работы продукта, качестве контента, удобстве использования продукта конечными пользователями.
Еще в одном проекте Ауриги CEF использовался в базовой конфигурации для замены штатного браузера операционной системы. Сделано это было для того, чтобы обеспечить безопасный защищенный доступ пользователя к порталу тестирования персонала организации. С помощью небольших плагинов разработчики расширили стандартный функционал браузера и организовали дополнительный контроль за пользователем во время проведения тестирования. Разработанное решение исключает возможность фальсификации результата тестирования, что стало еще одним конкурентным преимуществом на рынке подобных систем.
— Андрей Малашенко, Инженер Ауриги
Chromium embedded framework что это


КЛИЕНТ: обновление Chromium Embedded Framework
Новая версия CEF появится в PBE в следующем месяце.
Уголок разработчиков Автор RiotAether
Мы обещали периодически рассказывать, как мы улучшаем производительность и стабильность клиента Лиги.
Это короткая статья, поэтому мы не будем пересказывать суть вкратце.
Обновление Chromium Embedded Framework (CEF)
В настоящее время нашим главным приоритетом является переход на новую версию Chromium Embedded Framework (CEF) – веб-браузера, который лежит в основе архитектуры клиента Лиги. В последний раз мы обновляли CEF в ноябре 2019 года (до версии 74), а на момент написания данной статьи последняя версия CEF – 91. Как раз на нее мы и хотим перейти. Это сократит количество вылетов клиента, повысит совместимость и не только. Ни одно другое изменение не принесет столько пользы, сколько принесет обновление CEF.
Последние несколько месяцев мы занимались обновлением веб-компонентов (технологии для встраивания видео, отображения всплывающих окон и тому подобного) до версий, совместимых с новыми выпусками CEF, чтобы последующее обновление самого фреймворка ничего не сломало. Веб-компоненты используются практически во всех частях кодовой базы клиента, и у нас ушло на это больше времени, чем мы рассчитывали. К счастью, этот этап работы наконец завершен, и мы можем перейти непосредственно к обновлению CEF.
Недавно мы протестировали обновленный CEF, и результаты нас очень порадовали: новая версия клиента потребляет меньше памяти и не так сильно нагружает процессор. Мы уверены, что это решит и многие другие проблемы с игрой, но не хотим торопить события. Проект имеет огромное значение для всех игроков, и нам нужно полностью убедиться в стабильности нового клиента, прежде чем его обновлять.
Обновленный CEF должен появиться в PBE в начале августа, а спустя несколько недель – на основных серверах. Подробнее о нем вы сможете почитать в описании соответствующего обновления!
Другие проекты
- Улучшение послеигрового экрана. Этот проект – следующий на очереди после обновления CEF. Игроки часто жалуются на проблемы с послеигровым экраном, и мы планируем сосредоточиться на их устранении до конца этого года, заручившись поддержкой других команд. Сейчас мы работаем над тем, чтобы выявить основные проблемные места и определить, какие улучшения стоит внести.
- Повышениестабильности клиента в длительных сессиях. В конце прошлого года мы в экстренном порядке переключились на устранение утечек памяти, которые возникали, когда пользователи играли несколько матчей подряд или оставляли клиент открытым на долгое время. Изучив жалобы на ошибки в клиенте, мы заметили, что во многих случаях проблемы возникали только у игроков, которые оставляли клиент открытым и/или продолжали пользоваться им после того, как компьютер вышел из спящего режима. Сейчас мы планируем сделать так, чтобы клиент автоматически закрывался во время игры, если он потребляет слишком много памяти, и открывался заново после матча. Кроме того, клиент сам по себе станет стабильнее благодаря обновленному CEF.
На этом все! После обновления CEF мы впустим новую статью, в которой расскажем о результатах и планах на будущее.
Chromium Embedded Framework — Chromium Embedded Framework
Chromium Embedded Framework (CEF ) — это программный фреймворк с открытым исходным кодом для встраивания веб-браузер Chromium в другом приложении. Это позволяет разработчикам добавлять в свои приложения функции просмотра веб-страниц, а также возможность использовать HTML, CSS и JavaScript для создать пользовательский интерфейс приложения (или его части).
CEF работает в Linux, macOS и Windows. Он имеет много языковых привязок, включая C, C ++, C#, Go, Java и Python.
. Содержание
- 1 Обзор
- 2 Поддерживаемые языки
- 3 Приложения, использующие CEF
- 4 См. Также
- 5 Ссылки
- 6 Внешние ссылки
Обзор
Существует две версии Chromium Embedded Framework: CEF 1 и CEF 3. Разработка CEF 2 была прекращена после внешний вид Chromium Content API.
CEF 1 — это однопроцессная реализация, основанная на Chromium WebKit API. Он больше не активно разрабатывается и не поддерживается.
CEF 3 — это многопроцессорная реализация, основанная на Chromium Content API и имеющая производительность, аналогичную Google Chrome. Он использует асинхронный обмен сообщениями для связи между основным процессом приложения и одним или несколькими процессами визуализации (Blink + V8 JavaScript-движок). Он поддерживает плагины и расширения PPAPI, как внутренние (программа просмотра PDF), так и загружаемые извне. Однопроцессный режим выполнения не поддерживается, но все еще присутствует; в настоящее время используется только для целей отладки.
16 марта 2019 года нумерация версий CEF изменилась с выпуском CEF 73.1.3 + g46cf800 + chromium-73.0.3683.75. Предыдущий выпуск от 14 марта 2019 года был CEF 3.3683.1920.g9f41a27. Оба этих выпуска были основаны на Chromium 73.0.3683.75, однако в новой нумерации версии основной номер совпадает с основным номером версии Chromium, на которой она основана.
CEF поставляется с примером приложения под названием CefClient, которое написано на C ++ с использованием WinAPI, Cocoa или GTK (в зависимости от платформы) и содержит демонстрационные версии различных функций. Новые версии включают образец приложения под названием CefSimple, которое вместе с сопроводительным руководством показывает, как создать простое приложение с использованием CEF 3.
Документацию можно найти в файлах заголовков, расположенных в каталоге «include» и на других страницах. вики-страницы.
Spotify поддерживает разработки и стабильные сборки веток для Linux, Mac и Windows в 32- и 64-битных формах.
Поддерживаемые языки
Базовая структура CEF включает поддержку языков программирования C и C ++, но есть внешние проекты, которые обеспечивают привязки для других языков:
- Delphi (CEF1) — DCEF 1
- Delphi (CEF3) — DCEF 3
- Delphi (CEF3) — CEF4Delphi
- Delphi (CEF3) — WebKitX CEF3 ActiveX
- Dyalog APL (CEF3) — HTMLRenderer
- Free Pascal (CEF3) — fpCEF3
- Go (CEF3) — CEF2go
- Java (CEF3) — Java Chromium Embedded
- .NET ( CEF1, CEF3) — CefSharp
- .NET (CEF1) — CefGlue
- .NET / Mono (CEF3) — Xilium.CefGlue
- .NET (CEF3) — ChromiumFX
- .NET (CEF3) — WebKitX CEF3 ActiveX
- Python (CEF1, CEF3) — CEF Python
- Swift (CEF3) — CEF.swift
- Visual Basic 6 (CEF3) — WebKitX CEF3 ActiveX
- Visual FoxPro (CEF3) — WebKitX CEF3 ActiveX
- PowerBuilder (CEF3) — WebKitX CEF3 ActiveX
- Ruby (через ‘win32ole ‘библиотека) (CEF3) — WebKitX CEF3 ActiveX
- Visual Ba sic для приложений 2003/2007/2010/2015/2016 (VBA, Access, Excel) (CEF3) — WebKitX CEF3 ActiveX
- Microsoft Visual Studio.NET 2010/2015/2017 (VB.Net, C #, C ++, 32-разрядная и 64-разрядная версии) (CEF3) — WebKitX CEF3 ActiveX
- Xojo (для приложений Windows, 32-разрядная и 64-разрядная версии) (CEF3) — WebKitX CEF3 ActiveX
- Qt (любая версия Windows, только для 32-битной версии) (CEF3) — WebKitX CEF3 ActiveX
- CodeTyphon Studio — пакет pl_CEF
- Embarcadero RAD Studio (VCL C ++) (CEF3) — WebKitX CEF3 ActiveX
- Broadcom CA PLEX (VBScript / C ++) (CEF3) — WebKitX CEF3 ActiveX
Приложения, использующие CEF
- Adobe Acrobat
- Adobe Creative Cloud
- Adobe Dreamweaver — Dreamweaver — это инструмент веб-разработки, который использует CEF для управления загрузкой ресурсов, навигацией и контекстными меню.
- Adobe Edge Animate — инструменты разработки мультимедиа
- Adobe Edge Reflow — инструмент адаптивного веб-дизайна
- Amazon Music — медиаплеер для ПК и Mac
- AOL Desktop — веб-браузер со встроенным AOL emai l и клиенты обмена мгновенными сообщениями
- AOL Instant Messenger — клиент обмена мгновенными сообщениями, использующий CEF в Windows
- Autodesk Inventor — инструмент трехмерного проектирования. Начиная с версии 2015, он использует CEF для функции «Мой дом», домашней страницы, которая позволяет пользователям создавать новые файлы САПР и просматривать обучающие материалы.
- Battle.net — средство запуска игры
- BeamNG.drive — Использует CEF для визуализации пользовательского интерфейса
- Bitdefender — Браузер Safepay (часть программного обеспечения для обеспечения безопасности в Интернете)
- BlueStacks — Эмулятор Android для ПК и Mac
- — редактор с открытым исходным кодом для Интернета
- — ClassiCube — это игра, основанная на «классических» версиях Minecraft (CEF можно использовать только при установке подключаемого модуля
- — Coconut2D — это интегрированная среда разработки (IDE) для игр WebGL и классических веб-приложений ASP на базе node.js и CEF.
- Desura — игровая онлайн-платформа
- Dish World IPTV — платформа потокового видео
- — программа для цифровых вывесок
- Eve Online — Программа запуска на macOS содержит бета-версию программы запуска на Windows
- Evernote — программное обеспечение для создания заметок
- ExpanDrive — клиент сетевой файловой системы
- Facebook Messenger для Windows
- — Используется как оверлей для браузера сервера и других функций
- — Визуализация пользовательского интерфейса Warfare² (несуществующий мод для серии Call of Duty)
- Foxmail — бесплатный почтовый клиент от Tencent
- GOG Galaxy — дополнительный игровой клиент для GOG.com
- Google Web Designer — создание интерактивных сайтов HTML5 и рекламы
- Grand Theft Auto Online — многопользовательский движок для компьютерных игр Grand Theft Auto V
- Intel AppUp Encapsulator — программное обеспечение магазина приложений Intel
- Kaspersky Security Scan — Сканер от Лаборатории Касперского
- KKBOX — платформа потоковой музыки
- League of Legends — программа запуска игры
- LiveCode — программа для разработки мультиплатформенных приложений
- Логотипы — Программа для изучения Библии
- — используется коммерческий WYSIWYG редактор для веб-разработки
- MATLAB — использует CEF для своих uifigures
- Mailbird — программное обеспечение электронной почты Windows
- Max 8 — программное обеспечение визуального программирования
- MediaMan — программа-органайзер
- Minecraft — лаунчер для игры
- Multi Theft Auto — многопользовательский движок для компьютерной игры Grand Theft Auto: San Andreas
- Php Desktop — обеспечивает способ разработки собственных настольных графических приложений с использованием веб-технологий, таких как PHP, HTML5, JavaScript и SQLite.
- PokerStars — онлайн-покер cardroom
- Power BI — Программное обеспечение Business Intelligence
- QuarkXPress — Поддержка JavaScript
- Qobuz — Загрузка и потоковая передача HD музыкальная платформа
- Second Life — виртуальный онлайн-мир
- Sling TV — услуга IPTV, управляемая Dish Network.
- SolidWorks — CAD программное обеспечение.
- Spotify — платформа потоковой передачи музыки
- StarUML — редактор моделей UML
- Steam — платформа цифрового распространения видеоигр
- Tencent QQ — программа обмена мгновенными сообщениями (ее часть QPlus) и веб-браузер
- TOWeb — программное обеспечение для создания адаптивных веб-сайтов
- Trend Micro — программное обеспечение для обеспечения безопасности в Интернете
- UBot Studio — программное обеспечение для интернет-маркетинга и веб-автоматизации
- UNIFACE — UNIFACE среда выполнения и среда разработки.
- Unity3D — игровой движок
- Unreal Engine — игровой движок
- Uplay — онлайн-игровая платформа
- WebMenu Studio — приложение визуального дизайнера для создания иерархических меню DHTML. 262>Xojo — использует CEF3 с его элементом управления HTMLViewer в Windows
- 4D — система управления реляционными базами данных и IDE
- — приложение Web Messenger
См. Также
- Бесплатно и открыто портал исходного программного обеспечения
- Electron
- Qt WebEngine
- XULRunner