Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El código JavaScript del lado web puede acceder a los métodos y propiedades de WinRT del lado nativo con la ayuda de la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS). La herramienta wv2winrt genera los archivos de código necesarios para el código JavaScript y permite el uso de métodos y propiedades de cualquier API de WinRT, entre las que se incluyen:
- Las API de WinRT de la aplicación host WebView2.
- API de Windows WinRT.
- API de WinRT de terceros.
Para obtener más información acerca de por qué querría que el código JavaScript del lado web acceda a los métodos y propiedades de la aplicación host de WinRT, vea la introducción de Llamar al código del lado nativo del código del lado web.
Por qué WinRT y .NET usan enfoques diferentes
Este artículo es para las API de WinRT WebView2, no para las API de .NET WebView2. El código de C# indicado en este artículo se compilará para las API de .NET WebView2, pero no se ejecutará. Las llamadas AddHostObjectToScript con el código de C# de este artículo para las API de .NET WebView2 producirían un mensaje de error.
La herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS) es necesaria al proyectar objetos WinRT, ya que WinRT no admite IDispatch ningún otro mecanismo para inspeccionar e interactuar dinámicamente con objetos WinRT, que admiten las plataformas Win32 y .NET de WebView2. Para el uso de .NET de AddHostObjectToScript, consulte Llamar al código del lado nativo desde el código del lado web en lugar de este artículo.
Diferencias de configuración para WinUI 3 vs. WinUI 2
Si la aplicación WebView2 de WinRT tiene como destino WinUI 3 (SDK de Aplicaciones para Windows) en lugar de WinUI 2 (UWP), esta es una introducción a los pasos específicos de WinUI 3 que se proporcionan más adelante:
En una aplicación no empaquetada, tienes que realizar pasos adicionales que se encuentran en el artículo "Mejorar las aplicaciones de escritorio no empaquetadas con componentes de Windows Runtime".
Agregar
WinRTAdapteraCsWinRTIncludes.Para las aplicaciones WinUI 3 (SDK de Windows App), el proyecto de aplicación principal tiene una referencia a WinAppSDK, que incluye directamente su propia copia de los archivos SDK de WebView2, por lo que no puede incluir una referencia al SDK de WebView2 en el proyecto de aplicación principal sin generar mensajes de error.
No es necesario que la versión del adaptador del proyecto coincida.
Después de instalar las opciones "predeterminadas" para Visual Studio 2022 Community Edition, en Instalador Visual Studio, haga clic en la tarjeta .NET y, a la derecha, seleccione la casilla SDK de Aplicaciones para Windows C# Templates.
Si sigue sin aparecer la plantilla de proyecto correcta: en el instalador Visual Studio, haz clic en la tarjeta UWP para seleccionarla, selecciona la casilla de verificación Herramientas de C++ v143 a la derecha y, a continuación, haz clic en el botón Modificar.
Estrategia y objetivo final de este ejemplo
Estrategia
Este artículo le guiará por los siguientes pasos principales:
Cree un proyecto WinRTAdapter para la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS).
En este ejemplo, especifique las siguientes API del lado host para la proyección:
Ejecute la herramienta wv2winrt para generar código fuente de C++/WinRT para los espacios de nombres o clases seleccionados.
Llame a AddHostObjectToScript en el proyecto principal de WinUI.
Llame a métodos y propiedades en el objeto host desde el código JavaScript del lado web (o desde la consola de DevTools).
Objetivo final
En primer lugar, seleccionaremos algunas API de WinRT a las que nos interesa llamar desde código JavaScript. En este ejemplo, usaremos la clase WinRT Language , que se encuentra en el espacio de Windows.Globalization nombres, para las aplicaciones UWP de Windows. La clase Windows.Globalization.Language permite obtener información de idioma del SO nativo del cliente.
En la aplicación host de WebView2, el código JavaScript del lado web puede acceder a métodos y propiedades en el Language objeto que está en el código del lado nativo.
Obtener acceso a las API proyectadas a través de la consola de DevTools
Al final de este tutorial de ejemplo, usará la consola de Microsoft Edge DevTools para probar a leer la propiedad de host displayName de la Language clase:
const Windows = chrome.webview.hostObjects.sync.Windows;
(new Windows.Globalization.Language("en-US")).displayName;
A continuación, la consola de DevTools mostrará English (Estados Unidos), u otro nombre para mostrar en otro idioma, lo que demuestra que ha llamado al código del lado nativo desde el código JavaScript del lado web:
De forma similar, puede tener acceso a los miembros del espacio de nombres Windows.System.UserProfile .
Acceder a las API proyectadas mediante archivos de código fuente
De forma similar, en los archivos de código fuente, en lugar de en la consola de DevTools, puede obtener acceso al objeto host proyectado. En primer lugar, ejecute el código de configuración del script:
// early in setup code:
const Windows = chrome.webview.hostObjects.sync.Windows;
Luego, en el cuerpo principal del código, agregue llamadas a objetos proyectados, como las siguientes:
(new Windows.Globalization.Language("en-US")).displayName;
De forma similar, puede tener acceso a los miembros del espacio de nombres Windows.System.UserProfile .
Comencemos
Paso 1: Crear u obtener un proyecto WebView2 básico
Instalar Visual Studio
- Si Visual Studio 2015 o posterior aún no está instalado, en una ventana o pestaña independiente, consulte Instalar Visual Studio en Configuración del entorno de desarrollo para WebView2. Siga los pasos descritos en dicha sección y, a continuación, vuelva a esta página y continúe con los pasos siguientes. En el presente artículo se muestran capturas de pantalla de Visual Studio Community Edition 2022.
Instalar un canal de versión preliminar de Microsoft Edge
- Si aún no está instalado un canal de vista previa de Microsoft Edge (beta, desarrollador o canary), en una ventana o pestaña independiente, consulte Instalar un canal de vista previa de Microsoft Edge en Configuración del entorno de desarrollo para WebView2. Siga los pasos descritos en dicha sección y, a continuación, vuelva a esta página y continúe con los pasos siguientes.
Crear o abrir un proyecto WebView2 básico
Realice cualquiera de los siguientes enfoques para obtener un proyecto inicial de línea base que contenga un par de líneas de código WebView2 que inserte el control WebView2:
Use la solución de ejemplo de línea base proporcionada: Si aún no lo ha hecho, clona o descarga el repositorio en la
WebView2Samplesunidad local. En una ventana o pestaña independiente, consulte Descargar el repositorio de webView2Samples en Configuración del entorno de desarrollo para WebView2. Siga los pasos de esa sección y, a continuación, vuelva a esta página y continúe más abajo. Este enfoque utiliza la copia local de https://github.com/MicrosoftEdge/WebView2Samples/tree/main/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln.Usa una plantilla de proyecto en Visual Studio para crear una aplicación para UWP básica y agregar un control WebView2: Siga los pasos de Introducción a WebView2 en aplicaciones WinUI 2 (UWP) para crear un proyecto de inicio de línea base que contenga un par de líneas de código WebView2 que inserte el control WebView2.
Use su código base existente: Si ya tiene su propia base de código de aplicación, puede abrir ese proyecto en Visual Studio.
En la unidad local, abra el
.slnarchivo que obtuvo anteriormente, como la solución del repositorio de ejemplos:<your-repos-directory>/WebView2Samples-main/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln<your-repos-directory>/WebView2Samples/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln
La solución de ejemplo se abrirá en Visual Studio:
En Visual Studio, seleccione Depurar>Iniciar depuración. Esto compila el proyecto y luego ejecuta la versión de línea base del proyecto. Se abre la aplicación de línea base, como la ventana MyUWPGetStartApp :
Se muestra una aplicación WinUI 2 (UWP) que tiene un control WebView agregado, establecido para navegar inicialmente a Bing.com. Esta es la aplicación resultante de realizar los pasos de Introducción a WebView2 en aplicaciones de WinUI 2 (UWP).
Cierra la ventana de la aplicación.
Paso 2: Agregar un proyecto WinRTAdapter para la herramienta wv2winrt
A continuación, cree un proyecto WinRTAdapter para la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS). Este proyecto crea una biblioteca a partir del código que se genera al ejecutar la herramienta. El código generado permite que las API de WinRT se expongan en el control WebView2.
Agregue un proyecto para la herramienta wv2winrt de la siguiente manera:
En Visual Studio, abra el proyecto WinUI del paso anterior.
En el Explorador de soluciones, haga clic con el botón derecho en la solución (no en el proyecto) y seleccione Agregar>nuevo proyecto. Se abre el cuadro de diálogo Agregar un nuevo proyecto .
En el cuadro de texto Buscar, escribe Componente de Windows Runtime (C++/WinRT).
Enfoque alternativo: Si no agrega un proyecto mediante la plantilla de proyecto para el componente de Windows Runtime (C++/WinRT) como se describe en los pasos numerados siguientes, deberá instalar en su lugar la carga de trabajo de desarrollo de la Plataforma universal de Windows, siguiendo los pasos descritos en Aplicaciones para UWP Introducción a C>++/WinRT.
Selecciona la tarjeta de componente de Windows Runtime (C++/WinRT) y, a continuación, haz clic en el botón Siguiente:
Nota: Asegúrese de que la plantilla incluya "C++/WinRT" en su nombre. Si esta plantilla no aparece, instale la carga de trabajo de desarrollo de la Plataforma universal de Windows desde el instalador Visual Studio. Si usa Visual Studio 2019 y sigue sin encontrar la plantilla, instale las plantillas de C++/WinRT y el visualizador para la extensión VS2019 desde Extensiones > de Visual Studio > Administrar extensiones.
Se abre la ventana Configure su nuevo proyecto .
Configurar y crear el proyecto
En el cuadro de texto Nombre del proyecto , asígnele al proyecto el nombre WinRTAdapter, en concreto. Nota: Por ahora, debe usar este nombre de proyecto específico.
La ruta en la captura de pantalla anterior refleja el enfoque de clonación del repositorio de muestras.
Haga clic en el botón Crear.
Se abre el cuadro de diálogo Nuevo proyecto de Windows :
Haga clic en el botón Aceptar .
El proyecto WinRTAdapter se crea y se agrega en el Explorador de soluciones junto al proyecto principal:
Seleccione Guardar archivo> todo (Ctrl+Mayús+S).
La herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS) se ejecutará en este proyecto WinRTAdapter . En un paso a continuación, generará código para las clases seleccionadas en este proyecto.
Paso 3: Instalar la biblioteca de implementación de Windows para el proyecto WinRTAdapter
En el proyecto WinRTAdapter, instale la biblioteca de implementación de Windows (WIL) de la siguiente manera:
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto WinRTAdapter y, a continuación, seleccione Administrar paquetes NuGet. Se abre la ventana Administrador de paquetes NuGet en Visual Studio.
En la ventana Administrador de paquetes NuGet , haga clic en la pestaña Examinar .
En la ventana Administrador de paquetes NuGet , en el cuadro de búsqueda , escriba Biblioteca de implementación de Windows y, a continuación, seleccione la tarjeta de la Biblioteca de implementación de Windows :
Haga clic en el botón Instalar . Se abre el cuadro de diálogo Vista previa de los cambios :
Haga clic en el botón Aceptar .
Seleccione Guardar archivo> todo (Ctrl+Mayús+S).
WIL ahora está instalado para el proyecto WinRTAdapter . La Biblioteca de implementación de Windows (WIL) es una biblioteca de C++ de solo encabezado para facilitar el uso de codificación COM para Windows. Proporciona interfaces C++ legibles y con seguridad de tipos para patrones de codificación COM de Windows.
Paso 4: Instalar el SDK de versión preliminar de WebView2 para el proyecto WinRTAdapter
En el proyecto WinRTAdapter, instale también una versión preliminar del SDK de WebView2, como se indica a continuación:
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto WinRTAdapter y, a continuación, seleccione Administrar paquetes NuGet. Se abre la ventana Administrador de paquetes NuGet.
En la ventana Administrador de paquetes NuGet , haga clic en la pestaña Examinar .
Active la casilla Incluir versión preliminar .
En el cuadro de búsqueda , escriba WebView2.
Haga clic en la tarjeta Microsoft.Web.WebView2 . La información detallada aparece en el área central de la ventana.
En la lista desplegable Versión , seleccione una versión preliminar del SDK de WebView2 o asegúrese de que esté seleccionada la versión preliminar más reciente . La versión debe ser 1.0.1243.0 o superior. Anote el número de versión que seleccione.
Haga clic en el botón Instalar . Se abre el cuadro de diálogo Vista previa de los cambios :
Haga clic en el botón Aceptar .
Seleccione Guardar archivo> todo (Ctrl+Mayús+S).
El SDK de versión preliminar de WebView2 ya está instalado para el proyecto WinRTAdapter .
Paso 5: Instalar el SDK de versión preliminar de WebView2 (solo WinUI 2)
En el proyecto principal, como MyUWPGetStartApp, instale la misma versión de versión preliminar del SDK de WebView2 que instaló para el proyecto WinRTAdapter de la siguiente manera:
En el Explorador de soluciones, haga clic con el botón secundario en el proyecto principal, como MyUWPGetStartApp, y, a continuación, seleccione Administrar paquetes NuGet. Se abre la ventana Administrador de paquetes NuGet.
Active la casilla Incluir versión preliminar .
Seleccione la pestaña Examinar .
En el cuadro de búsqueda , escriba WebView2.
Haga clic en la tarjeta Microsoft.Web.WebView2 . La información detallada aparece en el área central de la ventana.
En la lista desplegable Versión , seleccione una versión preliminar del SDK de WebView2 o asegúrese de que esté seleccionada la versión preliminar más reciente . Asegúrese de usar la misma versión que usa el proyecto WinRTAdapter; para las aplicaciones WebView2 de WinRT destinadas a WinUI 2 (UWP), debe ser la misma versión que para el proyecto WinRTAdapter . La versión debe ser 1.0.1243.0 o superior.
Haga clic en el botón Instalar . Se abre el cuadro de diálogo Vista previa de los cambios para agregar WebView2 al proyecto principal.
Haga clic en el botón Aceptar .
Visual Studio debe tener un aspecto similar al de la sección Paso anterior, excepto que ahora, el Administrador de paquetes NuGet está abierto para el proyecto principal en lugar del proyecto WinRTAdapter .
Seleccione Guardar archivo> todo (Ctrl+Mayús+S).
El SDK de la versión preliminar de WebView2 ya está instalado para el proyecto principal.
Paso 6: Generar código fuente para las API de host seleccionadas
A continuación, configure la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS) para incorporar las clases de WinRT que desea usar. Esto genera archivos fuente que luego se compilarán. La generación de código para estas API permite que el código JavaScript del lado web llame a estas API.
En los pasos de ejemplo siguientes, especificaremos dos Windows espacios de nombres y la herramienta wv2winrt generará código fuente solo para las API de esos espacios de nombres:
Más adelante, cuando se esté ejecutando la aplicación de ejemplo, llamará a estas API desde la consola de DevTools para demostrar que estas API especificadas del lado host se pueden llamar desde código del lado web.
Especifique el espacio de nombres y la clase de la siguiente manera:
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto WinRTAdapter y, a continuación, seleccione Propiedades. Se abre el cuadro de diálogo Páginas de propiedades de WinRTAdapter .
A la izquierda, expanda y seleccione Propiedades> comunesWebView2.
Establezca Usar API de WinRT de WebView2 en No. Esto se hace para que el SDK de WebView2 no copie el componente WinRT de WebView2 en la salida del proyecto. Este proyecto WinRTAdapter no llama a ninguna API de WinRT de WebView2, por lo que no necesita el componente WinRT.
Establezca Usar la herramienta wv2winrt en Sí.
Establezca Usar mayúsculas y minúsculas de JavaScript en Sí.
En la fila Incluir filtros , haga clic en la columna de la derecha, haga clic en el menú desplegable de esa celda y, a continuación, haga clic en Editar. Se abre el cuadro de diálogo Incluir filtros .
En el cuadro de texto situado más arriba, pegue las siguientes cadenas en líneas separadas, sin espacios en blanco iniciales ni finales:
Windows.System.UserProfile Windows.Globalization.Language
Debe especificar el nombre completo de los espacios de nombres o clases, como se muestra arriba.
Haga clic en el botón Aceptar para cerrar el cuadro de diálogo Incluir filtros .
Asegúrese de que el cuadro de diálogo Páginas de propiedades de WinRTAdapter tenga el siguiente aspecto para este tutorial:
Haga clic en el botón Aceptar para cerrar el cuadro de diálogo Páginas de propiedades .
Seleccione Guardar archivo> todo (Ctrl+Mayús+S).
Agregar una referencia que apunte al proyecto de adaptador
A continuación, agregue una referencia en el proyecto principal, señalando el proyecto del adaptador.
En el proyecto principal, como MyUWPGetStartApp, agregue una referencia que apunte al proyecto WinRTAdapter de la siguiente manera:
En el Explorador de soluciones, expanda el proyecto principal, por ejemplo MyUWPGetStartApp, haga clic con el botón derecho en Referencias y seleccione Agregar referencia. Se abre el cuadro de diálogo Administrador de referencias .
En el árbol de la izquierda, seleccione Proyectos. Seleccione la casilla de verificación WinRTAdapter :
Haga clic en el botón Aceptar para cerrar el cuadro de diálogo Administrador de referencias .
Seleccione Guardar archivo> todo (Ctrl+Mayús+S).
Generar el código de API
A continuación, genere el código API:
Haga clic con el botón derecho en el proyecto WinRTAdapter y, a continuación, seleccione Compilar.
El código fuente se genera para los espacios de nombres o clases que especificó en el cuadro de diálogo Incluir filtros de la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS):
- Espacio de nombres
Windows.System.UserProfile - Clase
Windows.Globalization.Language
- Espacio de nombres
Una vez completada la compilación, seleccione Archivo>Guardar todo (Ctrl+Mayús+S).
Importante
Si instaló una versión de lanzamiento del SDK de WebView2 y se produce un error en la compilación con error MIDL2011: [msg]unresolved type declaration [context]: Microsoft.Web.WebView2.Core.ICoreWebView2DispatchAdapter [ RuntimeClass 'WinRTAdapter.DispatchAdapter' ], se trata de un problema en la versión de lanzamiento del SDK de WebView2 y deberá cambiar Usar API de WinRT de WebView2 a Sí en los pasos anteriores.
Como alternativa, agregue lo siguiente después del último </ItemGroup> en el archivo WinRTAdapter.vcxprojde proyecto:
<ItemGroup Condition="'$(WebView2UseDispatchAdapter)' == 'true'">
<Reference Include="$(WebView2SDKPath)lib\Microsoft.Web.WebView2.Core.winmd">
<!-- wv2winrt needs Dispatch Adapter metadata to generate code -->
</Reference>
</ItemGroup>
Reemplácelo $(WebView2SDKPath) por el directorio donde se instaló el SDK de WebView2, con un \ al final. Por ejemplo: ..\<sample-directory>\packages\Microsoft.Web.WebView2.1.0.1264.42\.
Paso 7: Actualizar el marco de destino (solo WinUI 3)
Si la aplicación es para WinUI 2 (UWP), omita este paso.
Paso 8: Agregar el objeto host en el proyecto principal
A continuación, pase el objeto WinRT del lado nativo de la aplicación host al lado web de la aplicación host. Para ello, agregue un InitializeWebView2Async método que llame a AddHostObjectToScript, como se indica a continuación:
En Explorador de soluciones, expande el proyecto principal, por ejemplo, MyUWPGetStartApp, expande MainPage.xaml y, a continuación, selecciona MainPage.xaml.cs.
Debajo del
MainPageconstructor, añada el método siguienteInitializeWebView2Async:private async void InitializeWebView2Async() { await WebView2.EnsureCoreWebView2Async(); var dispatchAdapter = new WinRTAdapter.DispatchAdapter(); WebView2.CoreWebView2.AddHostObjectToScript("Windows", dispatchAdapter.WrapNamedObject("Windows", dispatchAdapter)); }Este método llama a
AddHostObjectToScript.En la línea
AddHostObjectToScript("Windows", ...,Windowsestá el espacio de nombres de nivel superior. Si tiene otros espacios de nombres de nivel superior, puede agregar llamadas adicionales aAddHostObjectToScript, como en el ejemplo siguiente:WebView2.CoreWebView2.AddHostObjectToScript("RuntimeComponent1", dispatchAdapter.WrapNamedObject("RuntimeComponent1", dispatchAdapter));La
WrapNamedObjectllamada crea un objeto contenedor para el espacio deRuntimeComponent1nombres. LaAddHostObjectToScriptllamada agrega ese objeto ajustado al script con el nombreRuntimeComponent1.Para obtener instrucciones completas sobre cómo usar componentes WinRT personalizados, consulte Componentes WinRT personalizados (de terceros) a continuación.
En el
MainPageconstructor siguientethis.InitializeComponent();, agregue el código siguiente:InitializeWebView2Async();Haz clic con el botón secundario en el proyecto principal, por ejemplo, MyUWPGetStartApp, y selecciona Establecer como proyecto de inicio. La negrita indica proyecto de inicio.
Seleccione Guardar archivo> todo (Ctrl+Mayús+S).
Presione F5 para ejecutar la aplicación de ejemplo. Se abrirá la aplicación WinUI 2 (UWP) habilitada para WebView2:
El código del lado web de la aplicación host (y la consola DevTools) ahora pueden llamar a métodos y propiedades de los espacios de nombres o clases especificados del objeto host.
Paso 9: Llamar a métodos y propiedades en el objeto host desde el JavaScript del lado web
Obtener acceso a las API proyectadas a través de la consola de DevTools
A continuación, use la consola de DevTools para demostrar que el código del lado web puede llamar a las API del lado host que se especificaron en la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS):
Si la aplicación no se está ejecutando, en Visual Studio, presione F5 para ejecutar la aplicación de ejemplo.
Haga clic en la parte principal de la ventana de la aplicación de ejemplo de WebView2 para darle el foco y, a continuación, presione Ctrl+Mayús+I para abrir Microsoft Edge DevTools. O bien, haga clic con el botón derecho en la página y seleccione Inspeccionar.
Se abrirá la ventana Microsoft Edge DevTools.
Si no se muestra la ventana Microsoft Edge DevTools, presione Alt+Tab para mostrarla.
En la ventana DevTools , seleccione la pestaña Consola .
Haz clic en el botón Borrar consola (
) o haz clic con el botón derecho en la consola y selecciona Borrar consola. Es posible que los mensajes aparezcan periódicamente en la Consola.En la consola de DevTools, pegue el siguiente código de clase Windows.Globalization.Language y luego presione Entrar:
const Windows = chrome.webview.hostObjects.sync.Windows; (new Windows.Globalization.Language("en-US")).displayName;La Consola genera una cadena de nombre de idioma, como
English (Estados Unidos), que demuestra que el código del lado host (lado nativo) de la aplicación se puede llamar desde código JavaScript del lado web:
Intente omitir los paréntesis. En la consola de DevTools, escriba la siguiente instrucción:
new Windows.Globalization.Language("en-US").displayName;La Consola genera una cadena de nombre de idioma, como
English (Estados Unidos).De forma similar, puede tener acceso a los miembros del espacio de nombres Windows.System.UserProfile .
Cierre la ventana DevTools.
Cierre la aplicación.
Enhorabuena. Ha terminado la demostración de ejemplo de cómo llamar al código de WinRT desde código JavaScript.
Acceder a las API proyectadas mediante archivos de código fuente
Anteriormente, usamos la consola de DevTools para ejecutar instrucciones de JavaScript que acceden al objeto host proyectado. De forma similar, puede tener acceso al objeto host proyectado desde los archivos de código fuente. Para ello, primero ejecute el código de configuración del script:
// early in setup code:
const Windows = chrome.webview.hostObjects.sync.Windows;
Luego, en el cuerpo principal del código, agregue llamadas a objetos proyectados, como las siguientes:
(new Windows.Globalization.Language("en-US")).displayName;
De manera similar, puede acceder a Windows.System.UserProfile los miembros de API.
Este es el final de los pasos del tutorial. Las secciones siguientes son información general sobre las aplicaciones WebView2 WinRT.
Componentes de WinRT personalizados (de terceros)
La herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS) admite componentes WinRT personalizados de terceros, además de las API WinRT del sistema operativo propio.
Para usar componentes personalizados (de terceros) de WinRT con la herramienta wv2winrt , además de los pasos anteriores, siga los pasos siguientes:
Agregue un tercer proyecto (que no sea la aplicación principal y el proyecto WinRTAdapter) a la solución de Visual Studio que implementa la clase WinRT.
Haga que el proyecto WinRTAdapter "Agregue una referencia" al nuevo tercer proyecto que contiene la clase WinRT.
Actualice el filtro Incluir del proyecto WinRTAdapter en las propiedades para incluir también su nueva clase.
Agregue una línea adicional para
InitializeWebView2Asyncagregar el espacio de nombres de la clase winrt:WebView2.CoreWebView2.AddHostObjectToScript("MyCustomNamespace", dispatchAdapter.WrapNamedObject("MyCustomNamespace", dispatchAdapter));Para facilitar la llamada a métodos desde la Web, opcionalmente, agregue el proxy de sincronización del espacio de nombres como un objeto global en el script. Por ejemplo:
window.MyCustomNamespace = chrome.webview.hostObjects.sync.MyCustomNamespace;
Para obtener un ejemplo de esto, consulte el siguiente ejemplo de WebView2:
- uwp-wv2winrt-custom-csharp-winrt - Un ejemplo, como una rama.
Métodos WinRT asincrónicos
Siguiendo los pasos de la guía anterior, debería poder usar proxies sincrónicos. Para las llamadas a métodos asincrónicos, deberá usar chrome.webview.hostObjects.options.forceAsyncMethodMatches.
La forceAsyncMethodMatches propiedad es una matriz de Regex, donde si alguna Regex coincide con el nombre de un método en un proxy de sincronización, el método se ejecutará de forma asincrónica en su lugar. Si se establece en [/Async$/] se hará coincidir con cualquier método que termine con el sufijo Async. Entonces, las llamadas de método coincidentes funcionan como un método en un proxy asincrónico y devuelven una promesa que puede esperar.
Ejemplo:
const Windows = chrome.webview.hostObjects.sync.Windows;
chrome.webview.hostObjects.options.forceAsyncMethodMatches = [/Async$/];
let result = await Windows.System.Launcher.launchUriAsync(new Windows.Foundation.Uri('https://contoso.com/'));
Para obtener más información, vea la fila en el forceAsyncMethodMatchesmétodo CoreWebView2.AddHostObjectToScript.
Suscripción a eventos de WinRT
Los eventos de WinRT también se exponen a través de los proxies de script. Puede agregar y quitar controladores de eventos de WinRT de instancia y eventos estáticos de WinRT utilizando los addEventListener(string eventName, function handler) métodos and removeEventListener(string eventName, function handler) .
Estos métodos funcionan de forma similar a los métodos DOM del mismo nombre. Llamada addEventListener con un nombre de cadena del evento WinRT al que quieres suscribirte como primer parámetro y una devolución de llamada de función a la que se llamará cada vez que se genere el evento. Si se llama removeEventListener con los mismos parámetros, se cancelará la suscripción de ese evento. Por ejemplo:
const Windows = chrome.webview.hostObjects.sync.Windows;
const coreApplication = Windows.ApplicationModel.Core.CoreApplication;
const coreApplicationView = coreApplication.getCurrentView();
const titleBar = coreApplicationView.titleBar;
titleBar.addEventListener('IsVisibleChanged', () => {
console.log('titlebar visibility changed to: ' + titleBar.isVisible);
});
Para un evento WinRT que proporciona argumentos de evento, estos se proporcionan como el primer parámetro para la función de controlador de eventos. Por ejemplo, el evento tiene IMapChangedEventArgs<string, object> un Windows.Foundation.Collections.PropertySet.MapChanged objeto arg de evento y ese objeto se proporciona como parámetro para la devolución de llamada.
const Windows = chrome.webview.hostObjects.sync.Windows;
const propertySet = new Windows.Foundation.Collections.PropertySet();
propertySet.addEventListener('MapChanged', eventArgs => {
const key = eventArgs.key;
const collectionChange = eventArgs.collectionChange;
// ...
});
El objeto args del evento también tendrá las siguientes propiedades:
| Nombre de la propiedad | Description |
|---|---|
target |
El objeto que provocó el evento |
type |
Nombre de cadena del evento |
detail |
Una matriz de todos los parámetros proporcionados al delegado de WinRT |
Hacer que los proxies de JavaScript AddHostObjectToScript actúen de forma más parecida a otras API de JavaScript
AddHostObjectToScript usa de forma predeterminada proxies asincrónicos y detallados, pero puede hacer que los proxies de AddHostObjectToScript JavaScript actúen de forma más parecida a otras API de JavaScript. Para obtener más información sobre AddHostObjectToScript su comportamiento predeterminado, consulte AddHostObjectToScript. Además, si va a migrar una aplicación host desde JavaScript, la proyección de WinRT en JavaScript, aplicaciones para UWP o desde WebView basado en EdgeHTML, es posible que desee usar el siguiente enfoque para que coincida mejor con ese comportamiento anterior.
Para que los AddHostObjectToScript proxies de JavaScript actúen de forma más parecida a otras API de JavaScript, establezca las siguientes propiedades:
chrome.webview.hostObjects.option.defaultSyncProxy- Los proxies pueden ser asincrónicos o sincrónicos. Normalmente sabemos, cuando llamamos a un método en un proxy síncrono, que el resultado también debe ser un proxy sincrónico. Pero en algunos casos, perdemos ese contexto, como cuando proporcionamos una referencia a una función al código nativo, y luego código nativo llama posteriormente a esa función. En estos casos, el proxy será asincrónico, a menos que se establezca esta propiedad.chrome.webview.hostObjects.options.forceAsyncMethodMatches- Esta es una matriz de expresiones regulares. Si llama a un método en un proxy sincrónico, la llamada al método se realizará de forma asincrónica si el nombre del método coincide con una cadena o expresión regular que se encuentra en esta matriz. Establecer este valor en [/Async$/] hará que cualquier método que termine siendoAsyncuna llamada a un método asincrónico. Si un método asincrónico no coincide aquí y no se ve obligado a ser asincrónico, el método se invocará de forma sincrónica, bloqueando la ejecución del JavaScript de llamada y, a continuación, devolviendo la resolución de la promesa, en lugar de devolver una promesa.chrome.webview.hostObjects.options.ignoreMemberNotFoundError- Si intenta obtener el valor de una propiedad de un proxy y la propiedad no existe en la clase nativa correspondiente, obtendrá una excepción, a menos que establezca esta propiedad entrue, en cuyo caso el comportamiento coincidirá con el comportamiento de proyección de WinRT de Chakra (y el comportamiento general de JavaScript) y regresaráundefinedsin ningún error.
La proyección de WinRT de Chakra coloca los espacios de nombres de WinRT directamente en el objeto raíz. En contraste:
-
AddHostObjectToScriptColoca servidores proxy raíz asincrónicos enchrome.webview.hostObjects. -
AddHostObjectToScriptColoca los servidores proxy raíz de sincronización enchrome.webview.hostObjects.sync.
Para acceder a los proxies raíz donde esperaría el código de proyección WinRT de Chakra, puede asignar las ubicaciones del espacio de nombres WinRT del proxy raíz al objeto raíz. Por ejemplo:
window.Windows = chrome.webview.hostObjects.sync.Windows;
Para asegurarse de que el JavaScript que configura todo esto se ejecute antes que nada, puede agregar la instrucción anterior a JavaScript o puede decirle a WebView2 que inserte la instrucción anterior antes de ejecutar cualquier otro script, mediante el CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync método.
En el ejemplo siguiente se demuestran las técnicas anteriores:
webview.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(
"(() => {" +
"if (chrome && chrome.webview) {" +
"console.log('Setting up WinRT projection options');" +
"chrome.webview.hostObjects.options.defaultSyncProxy = true;" +
"chrome.webview.hostObjects.options.forceAsyncMethodMatches = [/Async$/,/AsyncWithSpeller$/];" +
"chrome.webview.hostObjects.options.ignoreMemberNotFoundError = true;" +
"window.Windows = chrome.webview.hostObjects.sync.Windows;" +
"}" +
"})();");
Obtener información sobre las propiedades de WebView2
La información sobre las propiedades de WebView2 está disponible en dos lugares:
- Las páginas de propiedades del proyecto WinRTAdapter.
-
wv2winrt.exeayuda de la línea de comandos. Esta es la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS).
Páginas de propiedades del proyecto WinRTAdapter
En las páginas de propiedades del proyecto WinRTAdapter, para obtener ayuda sobre una propiedad, haga clic en una fila de propiedades. La ayuda se muestra en la parte inferior del cuadro de diálogo:
Ayuda de línea de comandos para propiedades de wv2winrt.exe
La ayuda de la línea de comandos proporciona wv2winrt.exe información sobre los parámetros de la herramienta wv2winrt (la herramienta de proyección WebView2 WinRT JS). Por ejemplo:
| Parámetro | Description |
|---|---|
verbose |
Enumerar algunos contenidos para estándar, incluidos los archivos que se han creado e información sobre las reglas de inclusión y exclusión. |
include |
List como se indicó anteriormente excluirá los espacios de nombres y las runtime classes de forma predeterminada, excepto los enumerados. Las declaraciones include pueden ser espacios de nombres que incluyen todo el contenido de ese espacio de nombres o nombres de runtimeclass para incluir solo esa runtimeclass. |
use-javascript-case |
Cambia el código generado para producir nombres de métodos, nombres de propiedades, etc., que utilizan el mismo estilo de carcasa que la proyección WinRT de JavaScript de Chakra. El valor predeterminado es producir nombres que coincidan con el winrt. |
output-path |
Establece la ruta de acceso en la que se escribirán los archivos generados. |
output-namespace |
Establece el espacio de nombres que se va a usar para la clase WinRT generada. |
winmd-paths |
Una lista de espacios delimitados de todos los archivos winmd que deben examinarse para la generación de código. |
Vea también
Tutorial y ejemplo:
- Introducción a las aplicaciones de WinUI 2 (UWP): tutorial: pasos para crear una aplicación con WebView2 mediante una plantilla de proyecto.
- Aplicación de ejemplo de WinUI 2 (UWP) - Ejemplo: pasos para descargar, compilar, ejecutar y actualizar el ejemplo.
Referencia de la API:
- WinRT: Método CoreWebView2.AddHostObjectToScript
- Win32: Método ICoreWebView2::AddHostObjectToScript
- .NET: Método CoreWebView2.AddHostObjectToScript
Artículo equivalente en .NET:
- Llamar al código del lado nativo desde el código del lado web : cubre Win32/C++ y también cubre algunos aspectos de .NET/C# dentro de fotogramas.