Ich erstelle eine Anwendung in C#, die benutzerdefinierte Webseiten für die meisten der GUI hostet. Als Host möchte ich eine JavaScript-API bereitstellen, damit die eingebetteten Webseiten auf einige der von der Host-Anwendung bereitgestellten Dienste zugreifen können.Wie kann ich Javascript Callback-Funktion aus C# Host-Anwendung ausführen
Ich bin in der Lage, den einfachen Fall für das Arbeiten mit der WebBrowser.ObjectForScripting -Eigenschaft zu erhalten und eine Skriptklasse zu implementieren. Dies funktioniert hervorragend für synchrone Javascript-Aufrufe. Einige der vom Host bereitgestellten Vorgänge laufen jedoch lange und ich möchte die Möglichkeit bereitstellen, dass das JavaScript nach Abschluss des Vorgangs zurückgerufen wird. Und das ist, wo ich in Schwierigkeiten gerate.
Javascript:
function onComplete(result)
{
alert(result);
}
function start()
{
window.external.LongRunningProcess('data', onComplete);
}
C#:
[ComVisible(true)]
public class ScriptObject
{
public void LongRunningProcess(string data, <???> callback)
{
// do work, call the callback
}
}
Der 'Start' Funktion in Javascript diesen ganzen Prozess beginnt. Das Problem, das ich habe, ist, Was ist der Typ für den Rückruf? Und wie soll ich es von C# aus nennen?
Wenn ich den String-Typ für Callback verwende, kompiliert und läuft es, aber innerhalb der LongRunningProcess-Methode enthält Callback tatsächlich den vollen Inhalt der onComplete-Funktion (zB 'function onComplete (result) {alert (result)}')
Wenn ich den Objekttyp verwende, kommt er als COM-Objekt zurück. Mit der Microsoft.VisualBasic.Information.TypeName-Methode wird 'JScriptTypeInfo' zurückgegeben. Aber soweit ich das beurteilen kann, handelt es sich weder um einen echten Typ noch um eine wirkliche Erwähnung durch MSDN.
Wenn ich die IReflect Schnittstelle verwende, läuft es ohne Fehler, aber es gibt keine Mitglieder, Felder oder Eigenschaften auf dem Objekt, die ich finden kann.
Eine Umgehung wäre, den String-Namen der Callback-Funktion anstelle der Funktion selbst zu übergeben (z. B. window.external.LongRunningProcess ('data', 'onComplete');). Ich weiß, wie man die JavaScript-Funktion namentlich ausführt, aber ich würde lieber nicht diese Syntax in den Webseiten benötigen, es würde auch nicht mit Inline-Callback-Definitionen im Javascript arbeiten.
Irgendwelche Ideen?
Für was es wert ist, habe ich bereits dieses System mit dem Chromium Embedded-Framework arbeiten, aber ich arbeite daran, den Code auf das WebBrowser-Steuerelement zu portieren, um die heftige Größe der Neuverteilung Chrom zu vermeiden. Die HTML-Seiten, die entwickelt werden, werden jedoch eventuell unter Linux/Mac OSX laufen, wo Chromium wahrscheinlich noch verwendet wird.
ich bin kein Programmierer in C# ... und vielleicht ist dies für Ihr Problem keine Lösung, aber meine Kollegen eine Bibliothek verwenden JS innen exeguite C# (ich erinnere mich nicht, ob C# oder .net) ist vielleicht nutzlos für Sie, aber Sie versuchen zu sehen: http://javascriptdotnet.codeplex.com/. Oder Sie können 'callback' wie string' window.external.LongRunningProcess ('data', 'onComplete'); 'übergeben und in C# können Sie eine Funktion mit diesem Namen erstellen und diese wie einen Callback ausführen, ohne die JS-Funktion zu verwenden C# (aber mit einer nativen C# -Funktion) ... Wenn Kommentar nicht hilft Ihnen tut mir leid für die Zeit Verlust – Frogmouth