Возможно ли вызывать функцию из C# в JS

237
26 мая 2018, 02:50

Возможно ли зарегистрировать функцию в C#, и передать её в Chromium. Допустим, есть функция на C# , которая будет выглядеть так:

void ShowMessage(string text){
    MessageBox.Show(text);
}

А потом вызвать эту функцию из JS:

<script>ShowMessage("Test");</script>

Возможно ли реализовать такое?

Answer 1

Делал подобную вещь для 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

READ ALSO
WPF ComboBox + MVVM, запрос при выборе элемента

WPF ComboBox + MVVM, запрос при выборе элемента

В процессе работы над проектом возникла необходимость сделать ComboBox при выборе элемента которого выдавался бы запрос, Вроде - "А Вы уверены?",...

215
Элементы формы в dll

Элементы формы в dll

Как использовать элементы формы в методах библиотеки и подключить SystemWindows

198
Sql joins in linq

Sql joins in linq

Есть замечательная схема SQL Joins, которая иллюстрирует различные типы соединений в SQL:

228