Aquí hay un seguimiento de esta pregunta .
Estoy transfiriendo una aplicación WPF de CEFSharp a WebView2. Tengo un HostObject al que se debe acceder desde js en la ventana WebView2. Esto es todo, desmontado.
using System; using System.Runtime.InteropServices; namespace webview2Demo { [ClassInterface(ClassInterfaceType.AutoDual)] [ComVisible(true)] public class Api { public string Username { get; set; } public string Version = "1.1.1"; public Api() //ctor { } } }Puedo usar esta línea con éxito en el evento NavigationStarting del control WebView2 para hacer que el objeto sea visible desde Javascript. Hasta aquí todo bien.
webView.CoreWebView2.AddHostObjectToScript("api", new API());Puedo recuperar propiedades públicas y miembros como este. Hasta aquí todo bien.
(async function foo () { const api = chrome.webview.hostObjects.api const ver = await api.Version alert (ver) })(); Mi problema: ¿puedo establecer propiedades como esta de manera confiable, sin ningún tipo de condición de carrera asíncrona o riesgo de interbloqueo? api.Username = 'whoever' Parece funcionar pero no lo he encontrado documentado.
(async function foo () { const api = chrome.webview.hostObjects.api api.Username = 'whoever' const user = await api.Username alert (user) })();La documentación dice que HostObject está expuesto a través de Promises. ¿Estoy golpeando al colocador correctamente?
Cuando establece una propiedad en un proxy de JavaScript para un objeto host creado a través de CoreWebView2.AddHostObjectToScript, a diferencia de obtener una propiedad o llamar a un método, la asignación devuelve el mismo valor que se asignó y no una promesa que represente la finalización de esa asignación. La asignación de propiedades genera un mensaje que se envía de vuelta al proceso de la aplicación de host WebView2 y se asignará la propiedad, pero no tendrá la promesa de avisarle cuando esté completa.
Como alternativa, puede usar setHostProperty , un método que realizará la asignación de propiedades y devolverá una promesa que se resolverá cuando se complete la asignación de propiedades.
(async function foo () { const api = chrome.webview.hostObjects.api await api.setHostProperty('Username', 'whoever'); const user = await api.Username alert (user) })(); También hay una versión de sincronización de los proxies. En todas partes, un proxy asíncrono devuelve una promesa, el proxy de sincronización bloquea el subproceso de JavaScript en espera de una respuesta del proceso de host de WebView2. Por lo general, no desea bloquear el subproceso de JavaScript en espera de una llamada de proceso cruzado, pero en algunas circunstancias puede ser más práctico o aceptable. Los proxies asíncronos tienen un método de sync que devolverá la versión síncrona del proxy (asincrónicamente).
(async function foo () { // Note the one await call to get from async proxies to sync proxies const syncHostObjects = await chrome.webview.hostObjects.sync; const api = syncHostObjects.api; api.Username = 'whoever'; const user = api.Username alert (user) })();Dado que todos los mensajes de proxy de JavaScript viajan en la misma cola y deben manejarse en el mismo subproceso en el proceso de la aplicación de host WebView2, es posible que el uso de un establecedor de propiedades y no esperar a que se complete y luego llamar al captador aún forzará el reciba un mensaje para esperar a que se complete el conjunto y que su código original esté bien.