Jak mogę wykonać funkcję zwrotną JavaScript z aplikacji hosta C #

Tworzę aplikację w języku C #, która obsługuje niestandardowe strony internetowe przez większość GUI. Jako host chciałbym udostępnić interfejs API javascript, aby osadzone strony internetowe mogły uzyskać dostęp do niektórych usług świadczonych przez aplikację hosta.

Udało mi się uzyskać prostą sprawę dotyczącą tego działania, korzystając z właściwości WebBrowser.ObjectForScripting i implementując klasę skryptów. Działa to doskonale w przypadku synchronicznych wywołań javascript. Jednak niektóre operacje udostępniane przez hosta są długotrwałe i chciałbym zapewnić możliwość wywołania javascript po zakończeniu operacji. I tu wpadam w kłopoty.

Javascript:

function onComplete( result )
{
    alert( result );
}

function start()
{
    window.external.LongRunningProcess( 'data', onComplete );
}

DO#:

[ComVisible(true)]
public class ScriptObject
{
    public void LongRunningProcess( string data, <???> callback )
    {
        // do work, call the callback
    }
}

Funkcja „start” w javascript wyłącza cały proces. Mam problem, jaki jest typ wywołania zwrotnego? I jak mam to nazwać z C #?

Jeśli używam typu string dla wywołania zwrotnego, kompiluje się i uruchamia, ale z metody LongRunningProcess wywołanie zwrotne faktycznie zawiera pełną zawartość funkcji onComplete (tzn. 'Funkcja onComplete (wynik) {alert (wynik)}')

Jeśli używam typu obiektu, wraca on jako obiekt COM. Używając metody Microsoft.VisualBasic.Information.TypeName, zwraca „JScriptTypeInfo”. Ale o ile wiem, nie jest to prawdziwy typ, ani nie ma żadnej prawdziwej wzmianki o tym przez cały MSDN.

Jeśli korzystam z interfejsu IReflect, działa bez błędu, ale na obiekcie nie ma żadnych członków, pól ani właściwości, które mogę znaleźć.

Obejściem problemu byłoby przekazanie nazwy ciągu funkcji wywołania zwrotnego zamiast samej funkcji (np. Window.external.LongRunningProcess („data”, „onComplete”);). Wiem, jak wykonać funkcję javascript po nazwie, ale wolałbym, aby ta składnia nie była wymagana na stronach internetowych, nie działałaby również z wbudowanymi definicjami wywołania zwrotnego w javascript.

Jakieś pomysły?

Na co warto, mam już ten system działający z ramą Chromium Embedded, ale pracuję nad przeniesieniem kodu do formantu WebBrowser, aby uniknąć ogromnego rozmiaru redystrybucji Chromium. Jednak rozwijane strony HTML zostaną ostatecznie uruchomione w systemie Linux / Mac OSX, gdzie prawdopodobnie będzie nadal używany Chromium.

questionAnswers(2)

yourAnswerToTheQuestion