Возможно ли зарегистрировать функцию в C#, и передать её в Chromium. Допустим, есть функция на C# , которая будет выглядеть так:
void ShowMessage(string text){
MessageBox.Show(text);
}
А потом вызвать эту функцию из JS:
<script>ShowMessage("Test");</script>
Возможно ли реализовать такое?
Делал подобную вещь для Selenium + executeScriptAsync
и свой код на стороне клиента. Насколько я знаю, CefSharp тоже позволяет вызвать executeScriptAsync
. Идея в том, что C# код вызывает метод в JS, который не возвращает управление назад до тех пор, пока не нужно будет вызвать что-то из C#. То есть по сути это такой обратный вызов наоборот. Мы вызываем JS из C#, при этом C# код по сути ждёт, пока JS что-то захочет получить или сделать. И можно следующим вызовом передать результат.
Упрощенный пример на JS для однократного вызова. C# код устанавливает _requestReadyCallback в JS, который его потом вызывает и этот вызов "отпускает" ожидание C# кода на ExecuteAsyncScript, потом выполняется C# код и отдает ответ путем вызова другой функции в JS:
var _requestReadyCallback;
function setSeleniumCallback(seleniumCallback) {
_requestReadyCallback = seleniumCallback;
}
function replyFromSelenium(data) {
console.log('Got reply from Selenium ' + data);
}
window.setTimeout(() => { _requestReadyCallback("getDate"); }, 2000);
C#
var dataFromJs = browser.ExecuteAsyncScript("setSeleniumCallback(arguments[0]);");
Console.WriteLine($"Received '{dataFromJs}' at {DateTime.Now}");
browser.ExecuteScript("replyFromSelenium(arguments[0])", DateTime.Now.ToString());
В production-коде я использую очередь Promise-ов на стороне JS и do {...} while цикл в C# обработки запросов. В результате JS не блокирован на получение ответа от C# и C# код не делает polling, ожидая запроса ровно столько, сколько нужно.
Альтернативным вариантом будет поднять локальный http сервер на C# и обращаться к нему из Javascript
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В процессе работы над проектом возникла необходимость сделать ComboBox при выборе элемента которого выдавался бы запрос, Вроде - "А Вы уверены?",...
Как использовать элементы формы в методах библиотеки и подключить SystemWindows
Есть замечательная схема SQL Joins, которая иллюстрирует различные типы соединений в SQL: