Aufrufen von systemeigenem WinRT-Code aus webseitigem Code
Ihr webseitiger JavaScript-Code kann mit Hilfe des wv2winrt-Tools (WebView2 WinRT JS Projection Tool) auf native WinRT-Methoden und -Eigenschaften zugreifen. Das wv2winrt-Tool generiert die erforderlichen Codedateien für Ihren JavaScript-Code und ermöglicht die Verwendung von Methoden und Eigenschaften beliebiger WinRT-APIs, einschließlich:
- WinRT-APIs Ihrer WebView2-Host-App.
- Windows WinRT-APIs.
- WinRT-APIs von Drittanbietern.
Weitere Informationen dazu, warum Ihr webseitiger JavaScript-Code auf die Methoden und Eigenschaften Ihrer WinRT-Host-App zugreifen soll, finden Sie in der Einführung von Aufrufen von nativem Code aus webseitigem Code.
Warum WinRT und .NET unterschiedliche Ansätze verwenden
Dieser Artikel gilt für WinRT WebView2-APIs, nicht für .NET WebView2-APIs. Der C#-Code in diesem Artikel wird für .NET WebView2-APIs erstellt, aber nicht ausgeführt. Das Aufrufen AddHostObjectToScript
mit dem C#-Code dieses Artikels für .NET WebView2-APIs würde eine Fehlermeldung erzeugen.
Das wv2winrt-Tool (das WebView2 WinRT JS-Projektionstool) wird beim Projizieren von WinRT-Objekten benötigt, da WinRT keine anderen Mechanismen unterstützt IDispatch
, um WinRT-Objekte dynamisch zu untersuchen und mit winRT-Objekten zu interagieren, die die Win32- und .NET-Plattformen von WebView2 unterstützen. Informationen zur Verwendung von .NET finden Sie unter Aufrufen von nativem Code aus webseitigem Code anstelle dieses Artikels.AddHostObjectToScript
Unterschiede beim Einrichten von WinUI 3 und WinUI 2
Wenn Ihre WinRT WebView2-App auf WinUI 3 (Windows App SDK) und nicht auf WinUI 2 (UWP) abzielt, finden Sie hier eine Übersicht über die WinUI 3-spezifischen Schritte, die weiter unten beschrieben werden:
In einer nicht gepackten App müssen Sie zusätzliche Schritte ausführen, die im Artikel "Verbessern von nicht gepackten Desktop-Apps mit Windows-Runtime-Komponenten" aufgeführt sind.
Fügen Sie zu hinzu
WinRTAdapter
CsWinRTIncludes
.Für WinUI 3-Apps (Windows App SDK) verfügt das Standard-App-Projekt über einen Verweis auf WinAppSDK, der direkt eine eigene Kopie der WebView2 SDK-Dateien enthält, sodass Sie keinen Verweis auf das WebView2 SDK in das Standard App-Projekt einschließen können, ohne Fehlermeldungen zu erzeugen.
Die Projektadapterversion muss nicht übereinstimmen.
Klicken Sie nach der Installation der Standardoptionen für Visual Studio 2022 Community Edition in Visual Studio-Installer auf die .NET-Karte, und aktivieren Sie dann auf der rechten Seite das Kontrollkästchen Windows App SDK C#-Vorlagen.
Wenn die richtige Projektvorlage immer noch nicht angezeigt wird: Klicken Sie im Visual Studio-Installer auf die UWP-Karte, um sie auszuwählen, aktivieren Sie das Kontrollkästchen v143 C++-Tools auf der rechten Seite, und klicken Sie dann auf die Schaltfläche Ändern.
Strategie und Endziel dieses Beispiels
Strategie
Dieser Artikel führt Sie durch die folgenden Standard Schritte:
Erstellen Sie ein WinRTAdapter-Projekt für das wv2winrt-Tool (webView2 WinRT JS Projection Tool).
Geben Sie für dieses Beispiel die folgenden hostseitigen APIs für die Projektion an:
Führen Sie das wv2winrt-Tool aus, um C++/WinRT-Quellcode für die ausgewählten Namespaces oder Klassen zu generieren.
Rufen Sie AddHostObjectToScript in Ihrem Standard WinUI-Projekt auf.
Rufen Sie Methoden und Eigenschaften für das Hostobjekt aus Ihrem webseitigen JavaScript-Code (oder über die DevTools-Konsole) auf.
Endziel
Zunächst wählen wir einige WinRT-APIs aus, die wir aus JavaScript-Code aufrufen möchten. In diesem Beispiel verwenden wir die WinRT-Klasse Language
, die Windows.Globalization
sich im -Namespace befindet, für Windows-UWP-Anwendungen. Die Windows.Globalization.Language-Klasse ermöglicht das Abrufen von Sprachinformationen vom nativen Betriebssystem des Clients.
In der WebView2-Host-App kann der webseitige JavaScript-Code dann auf Methoden und Eigenschaften des Language
Objekts zugreifen, das sich im nativen Code befindet.
Zugreifen auf projizierte APIs über die DevTools-Konsole
Am Ende dieser exemplarischen Vorgehensweise verwenden Sie die Konsole von Microsoft Edge DevTools, um das Lesen der Hosteigenschaft displayName
der Language
-Klasse zu testen:
const Windows = chrome.webview.hostObjects.sync.Windows;
(new Windows.Globalization.Language("en-US")).displayName;
Die DevTools-Konsole gibt dann oder einen anderen Anzeigenamen der Sprache aus English (United States)
, um zu veranschaulichen, dass Sie nativen Code aus webseitigem JavaScript-Code aufgerufen haben:
Auf ähnliche Weise können Sie auf Windows.System.UserProfile Namespace-Member zugreifen.
Zugreifen auf projizierte APIs über Quellcodedateien
Ebenso können Sie in Quellcodedateien und nicht in der DevTools-Konsole auf das projizierte Hostobjekt zugreifen. Führen Sie zunächst Setupcode für das Skript aus:
// early in setup code:
const Windows = chrome.webview.hostObjects.sync.Windows;
Anschließend fügen Sie im Standard Textkörper Ihres Codes Aufrufe zu projizierten Objekten hinzu, wie im Folgenden gezeigt:
(new Windows.Globalization.Language("en-US")).displayName;
Auf ähnliche Weise können Sie auf Windows.System.UserProfile Namespace-Member zugreifen.
Los geht's!
Schritt 1: Erstellen oder Abrufen eines einfachen WebView2-Projekts
Installieren von Visual Studio
- Wenn Visual Studio 2015 oder höher noch nicht installiert ist, finden Sie in einem separaten Fenster oder einer separaten Registerkarte weitere Informationen unter Installieren von Visual Studio unter Einrichten Ihrer Entwicklungsumgebung für WebView2. Führen Sie die Schritte in diesem Abschnitt aus, kehren Sie dann zu dieser Seite zurück, und fahren Sie mit den folgenden Schritten fort. Der vorliegende Artikel enthält Screenshots für Visual Studio Community Edition 2022.
Installieren eines Vorschaukanals von Microsoft Edge
- Wenn noch kein Vorschaukanal von Microsoft Edge (Beta, Dev oder Canary) in einem separaten Fenster oder einer separaten Registerkarte installiert ist, finden Sie weitere Informationen unter Installieren eines Vorschaukanals von Microsoft Edge unter Einrichten Ihrer Entwicklungsumgebung für WebView2. Führen Sie die Schritte in diesem Abschnitt aus, kehren Sie dann zu dieser Seite zurück, und fahren Sie mit den folgenden Schritten fort.
Erstellen oder Öffnen eines einfachen WebView2-Projekts
Führen Sie einen der folgenden Ansätze aus, um ein Baselinestartprojekt zu erhalten, das ein paar Zeilen WebView2-Code enthält, der das WebView2-Steuerelement einbettet:
Verwenden Sie die bereitgestellte Basisbeispiellösung: Falls noch nicht geschehen, klonen Sie das Repository, oder laden Sie es
WebView2Samples
auf Ihr lokales Laufwerk herunter. In einem separaten Fenster oder einer separaten Registerkarte finden Sie weitere Informationen unter Herunterladen des WebView2Samples-Repositorys unter Einrichten Ihrer Entwicklungsumgebung für WebView2. Führen Sie die Schritte in diesem Abschnitt aus, kehren Sie dann zu dieser Seite zurück, und fahren Sie weiter unten fort. Bei diesem Ansatz wird Ihre lokale Kopie von https://github.com/MicrosoftEdge/WebView2Samples/tree/main/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.slnverwendet.Verwenden Sie eine Projektvorlage in Visual Studio, um eine einfache UWP-App zu erstellen und ein WebView2-Steuerelement hinzuzufügen: Führen Sie die Schritte unter Erste Schritte mit WebView2 in WinUI 2-Apps (UWP) aus, um ein Baselinestartprojekt zu erstellen, das einige WebView2-Codezeilen enthält, die das WebView2-Steuerelement einbetten.
Verwenden Sie Ihre vorhandene Codebasis: Wenn Sie bereits über eine eigene App-Codebasis verfügen, können Sie dieses Projekt in Visual Studio öffnen.
Öffnen Sie auf Ihrem lokalen Laufwerk die
.sln
Datei, die Sie oben abgerufen haben, z. B. die Beispielrepositorylösung:<your-repos-directory>/WebView2Samples-main/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln
<your-repos-directory>/WebView2Samples/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln
Die Beispielprojektmappe wird in Visual Studio geöffnet:
Wählen Sie in Visual Studio Debuggen>Debuggen starten aus. Dadurch wird das Projekt erstellt und dann die Baselineversion des Projekts ausgeführt. Die Baseline-App wird geöffnet, z. B. das Fenster MyUWPGetStartApp :
Es wird eine WinUI 2-App (UWP) angezeigt, die ein WebView-Steuerelement hinzugefügt hat, das auf die anfängliche Navigation zu Bing.com festgelegt ist. Dies ist die App, die sich aus den Schritten unter Erste Schritte mit WebView2 in WinUI 2-Apps (UWP) ergibt.
Schließen Sie das App-Fenster.
Schritt 2: Hinzufügen eines WinRTAdapter-Projekts für das wv2winrt-Tool
Erstellen Sie als Nächstes ein WinRTAdapter-Projekt für das wv2winrt-Tool (webView2 WinRT JS Projection Tool). Dieses Projekt erstellt eine Bibliothek aus Code, der durch Ausführen des Tools generiert wird. Mit diesem generierten Code können WinRT-APIs im WebView2-Steuerelement verfügbar gemacht werden.
Fügen Sie wie folgt ein Projekt für das wv2winrt-Tool hinzu:
Öffnen Sie in Visual Studio Ihr WinUI-Projekt aus dem vorherigen Schritt.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe (nicht auf das Projekt), und wählen Sie dannNeues Projekthinzufügen> aus. Das Dialogfeld Neues Projekt hinzufügen wird geöffnet.
Geben Sie im Textfeld SuchenWindows-Runtime Component (C++/WinRT) ein.
Alternativer Ansatz: Wenn Sie kein Projekt mithilfe der Projektvorlage für Windows-Runtime Component (C++/WinRT) hinzufügen, wie in den nummerierten Schritten unten beschrieben, müssen Sie stattdessen die Workload Universelle Windows-Plattform Entwicklung installieren, indem Sie die Schritte unter Einführung in C++/WinRT für UWP-Anwendungen >ausführen.
Wählen Sie die Karte Windows-Runtime-Komponente (C++/WinRT) aus, und klicken Sie dann auf die Schaltfläche Weiter:
Hinweis: Stellen Sie sicher, dass die Vorlage "C++/WinRT" im Namen enthält. Wenn diese Vorlage nicht aufgeführt ist, installieren Sie die Workload Universelle Windows-Plattform Entwicklung aus dem Visual Studio-Installer. Wenn Sie Visual Studio 2019 verwenden und die Vorlage immer noch nicht finden können, installieren Sie die C++/WinRT-Vorlagen und die Schnellansicht für die VS2019-Erweiterung von Visual Studio-Erweiterungen >> verwalten.
Das Fenster Neues Projekt konfigurieren wird geöffnet.
Konfigurieren und Erstellen des Projekts
Geben Sie dem Projekt im Textfeld Projektname den Namen WinRTAdapter. Hinweis: Vorerst müssen Sie diesen spezifischen Projektnamen verwenden.
Der Pfad im obigen Screenshot spiegelt den Ansatz zum Klonen des Beispielrepositorys wider.
Klicken Sie auf die Schaltfläche Erstellen.
Das Dialogfeld Neues Windows-Projekt wird geöffnet:
Klicken Sie auf die Schaltfläche OK .
Das WinRTAdapter-Projekt wird erstellt und in Projektmappen-Explorer neben dem Standard-Projekt hinzugefügt:
Wählen Sie Datei>Alle speichern (STRG+UMSCHALT+S) aus.
Das wv2winrt-Tool (das WebView2 WinRT JS-Projektionstool) wird in diesem WinRTAdapter-Projekt ausgeführt. In einem folgenden Schritt generieren Sie Code für ausgewählte Klassen in diesem Projekt.
Schritt 3: Installieren der Windows-Implementierungsbibliothek für das WinRTAdapter-Projekt
Installieren Sie im WinRTAdapter-Projekt die Windows-Implementierungsbibliothek (Windows Implementation Library, WIL) wie folgt:
Klicken Sie Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WinRTAdapter, und wählen Sie dann NuGet-Pakete verwalten aus. Das Fenster NuGet-Paket-Manager wird in Visual Studio geöffnet.
Klicken Sie im Fenster NuGet-Paket-Manager auf die Registerkarte Durchsuchen .
Geben Sie im Fenster NuGet-Paket-Manager im Feld Suchen den Namen Windows-Implementierungsbibliothek ein, und wählen Sie dann die Windows-Implementierungsbibliothek Karte aus:
Klicken Sie auf die Schaltfläche Installieren . Das Dialogfeld Vorschau der Änderungen wird geöffnet:
Klicken Sie auf die Schaltfläche OK .
Wählen Sie Datei>Alle speichern (STRG+UMSCHALT+S) aus.
WIL ist jetzt für das WinRTAdapter-Projekt installiert. Die Windows-Implementierungsbibliothek (Windows Implementation Library, WIL) ist eine C++-Bibliothek, die nur für Header verwendet wird, um die Verwendung von COM-Codierung für Windows zu vereinfachen. Es bietet lesbare, typsichere C++-Schnittstellen für Windows COM-Codierungsmuster.
Schritt 4: Installieren des WebView2-Vorabversions-SDK für das WinRTAdapter-Projekt
Installieren Sie im WinRTAdapter-Projekt auch eine Vorabversion des WebView2 SDK wie folgt:
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WinRTAdapter, und wählen Sie dann NuGet-Pakete verwalten aus. Das Fenster NuGet-Paket-Manager wird geöffnet.
Klicken Sie im Fenster NuGet-Paket-Manager auf die Registerkarte Durchsuchen .
Aktivieren Sie das Kontrollkästchen Vorabversion einschließen .
Geben Sie webView2 in das Suchfeld ein.
Klicken Sie auf die Karte Microsoft.Web.WebView2. Ausführliche Informationen werden im mittleren Bereich des Fensters angezeigt.
Wählen Sie in der Dropdownliste Version eine Vorabversion des WebView2 SDK aus, oder stellen Sie sicher, dass Neueste Vorabversion ausgewählt ist. Die Version muss 1.0.1243.0 oder höher sein. Notieren Sie sich, welche Versionsnummer Sie auswählen.
Klicken Sie auf die Schaltfläche Installieren . Das Dialogfeld Vorschau der Änderungen wird geöffnet:
Klicken Sie auf die Schaltfläche OK .
Wählen Sie Datei>Alle speichern (STRG+UMSCHALT+S) aus.
Das WebView2-Vorabversions-SDK ist jetzt für das WinRTAdapter-Projekt installiert.
Schritt 5: Installieren des WebView2-Vorabversions-SDK (nur WinUI 2)
Installieren Sie im Standard Projekt, z. B. MyUWPGetStartApp, die gleiche Vorabversion des WebView2 SDK wie für das WinRTAdapter-Projekt wie folgt:
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Standard Projekt, z. B. MyUWPGetStartApp, und wählen Sie dann NuGet-Pakete verwalten aus. Das Fenster NuGet-Paket-Manager wird geöffnet.
Aktivieren Sie das Kontrollkästchen Vorabversion einschließen .
Wählen Sie die Registerkarte Durchsuchen aus.
Geben Sie webView2 in das Suchfeld ein.
Klicken Sie auf die Karte Microsoft.Web.WebView2. Ausführliche Informationen werden im mittleren Bereich des Fensters angezeigt.
Wählen Sie in der Dropdownliste Version eine Vorabversion des WebView2 SDK aus, oder stellen Sie sicher, dass Neueste Vorabversion ausgewählt ist. Stellen Sie sicher, dass Sie dieselbe Version wie das WinRTAdapter-Projekt verwenden. Für WinRT WebView2-Apps, die auf WinUI 2 (UWP) ausgerichtet sind, muss dies die gleiche Version wie für das WinRTAdapter-Projekt sein. Die Version muss 1.0.1243.0 oder höher sein.
Klicken Sie auf die Schaltfläche Installieren . Das Dialogfeld Vorschau der Änderungen wird geöffnet, um WebView2 zum Standard-Projekt hinzuzufügen.
Klicken Sie auf die Schaltfläche OK .
Visual Studio sollte dem obigen Schrittabschnitt ähneln, mit dem Unterschied, dass jetzt der NuGet-Paket-Manager für das Standard-Projekt anstelle des WinRTAdapter-Projekts geöffnet ist.
Wählen Sie Datei>Alle speichern (STRG+UMSCHALT+S) aus.
Das WebView2-Vorabversions-SDK ist jetzt für das Standard-Projekt installiert.
Schritt 6: Generieren von Quellcode für ausgewählte Host-APIs
Konfigurieren Sie als Nächstes das wv2winrt-Tool (webView2 WinRT JS Projection Tool), um die WinRT-Klassen zu integrieren, die Sie verwenden möchten. Dadurch werden Quelldateien generiert, die dann kompiliert werden. Durch das Generieren von Code für diese APIs kann Ihr webseitiger JavaScript-Code diese APIs aufrufen.
In den folgenden Beispielschritten geben wir zwei Windows
Namespaces an, und das wv2winrt-Tool generiert Quellcode nur für APIs unter diesen Namespaces:
Später, wenn die Beispiel-App ausgeführt wird, rufen Sie diese APIs über die DevTools-Konsole auf, um zu zeigen, dass diese angegebenen hostseitigen APIs aus webseitigem Code aufgerufen werden können.
Geben Sie den Namespace und die Klasse wie folgt an:
Klicken Sie Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WinRTAdapter, und wählen Sie dann Eigenschaften aus. Das Dialogfeld WinRTAdapter-Eigenschaftenseiten wird geöffnet.
Erweitern Sie links, und wählen Sie Allgemeine Eigenschaften>WebView2 aus.
Legen Sie WebView2 WinRT-APIs verwenden auf Nein fest. Dies bedeutet, dass das WebView2 SDK die WebView2 WinRT-Komponente nicht in die Ausgabe des Projekts kopiert. Dieses WinRTAdapter-Projekt ruft keine WebView2-WinRT-APIs auf, sodass die WinRT-Komponente nicht benötigt wird.
Legen Sie Use the wv2winrt tool (wv2winrt-Tool verwenden) auf Ja fest.
Legen Sie Use JavaScript case (JavaScript-Groß-/Kleinschreibung verwenden ) auf Ja fest.
Klicken Sie in der Zeile Filter einschließen auf die Spalte auf der rechten Seite, klicken Sie in dieser Zelle auf das Dropdownmenü, und klicken Sie dann auf Bearbeiten. Das Dialogfeld Filter einschließen wird geöffnet.
Fügen Sie im obersten Textfeld die folgenden Zeichenfolgen in separaten Zeilen ohne voranschreibende oder nachfolgende Leerzeichen ein:
Windows.System.UserProfile Windows.Globalization.Language
Sie müssen den vollständigen Namen der Namespaces oder Klassen angeben, wie oben gezeigt.
Klicken Sie auf die Schaltfläche OK , um das Dialogfeld Filter einschließen zu schließen.
Stellen Sie für diese exemplarische Vorgehensweise sicher, dass das Dialogfeld WinRTAdapter-Eigenschaftenseiten wie folgt aussieht:
Klicken Sie auf die Schaltfläche OK , um das Dialogfeld Eigenschaftenseiten zu schließen.
Wählen Sie Datei>Alle speichern (STRG+UMSCHALT+S) aus.
Hinzufügen eines Verweises, der auf das Adapterprojekt verweist
Fügen Sie als Nächstes im Standard-Projekt einen Verweis hinzu, der auf das Adapterprojekt verweist.
Fügen Sie im Standard Projekt, z. B. MyUWPGetStartApp, wie folgt einen Verweis hinzu, der auf das WinRTAdapter-Projekt verweist:
Erweitern Sie in Projektmappen-Explorer das Standard Projekt, z. B. MyUWPGetStartApp, klicken Sie mit der rechten Maustaste auf Verweise, und wählen Sie dann Verweis hinzufügen aus. Das Dialogfeld Verweis-Manager wird geöffnet.
Wählen Sie in der Struktur auf der linken Seite Projekte aus. Aktivieren Sie das Kontrollkästchen WinRTAdapter :
Klicken Sie auf die Schaltfläche OK , um das Dialogfeld Verweis-Manager zu schließen.
Wählen Sie Datei>Alle speichern (STRG+UMSCHALT+S) aus.
Generieren des API-Codes
Generieren Sie als Nächstes den API-Code:
Klicken Sie mit der rechten Maustaste auf das Projekt WinRTAdapter , und wählen Sie dann Erstellen aus.
Quellcode wird für Namespaces oder Klassen generiert, die Sie im Dialogfeld Filter einschließen des wv2winrt-Tools (webView2 WinRT JS Projection Tool) angegeben haben:
-
Windows.System.UserProfile
Namespace -
Windows.Globalization.Language
-Klasse
-
Wählen Sie nach Abschluss der Erstellung Datei>Alle speichern (STRG+UMSCHALT+S) aus.
Wichtig
Wenn Sie eine Releaseversion des WebView2 SDK installiert haben und Ihr Build mit error MIDL2011: [msg]unresolved type declaration [context]: Microsoft.Web.WebView2.Core.ICoreWebView2DispatchAdapter [ RuntimeClass 'WinRTAdapter.DispatchAdapter' ]
fehlschlägt, ist dies ein Problem in der Releaseversion des WebView2 SDK, und Sie müssen Use WebView2 WinRT APIs in den obigen Schritten in Yes ändern.
Fügen Sie alternativ nach dem letzten </ItemGroup>
in der Projektdatei WinRTAdapter.vcxproj
Folgendes hinzu:
<ItemGroup Condition="'$(WebView2UseDispatchAdapter)' == 'true'">
<Reference Include="$(WebView2SDKPath)lib\Microsoft.Web.WebView2.Core.winmd">
<!-- wv2winrt needs Dispatch Adapter metadata to generate code -->
</Reference>
</ItemGroup>
Ersetzen Sie durch $(WebView2SDKPath)
das Verzeichnis, in dem das WebView2 SDK installiert wurde, durch ein \
am Ende. Beispiel: ..\<sample-directory>\packages\Microsoft.Web.WebView2.1.0.1264.42\
.
Schritt 7: Aktualisieren des Zielframeworks (nur WinUI 3)
Wenn Ihre App für WinUI 2 (UWP) vorgesehen ist, überspringen Sie diesen Schritt.
Schritt 8: Hinzufügen des Hostobjekts zum Standard-Projekt
Übergeben Sie als Nächstes das WinRT-Objekt von der nativen Seite der Host-App an die Webseite der Host-App. Fügen Sie hierzu wie folgt eine InitializeWebView2Async
Methode hinzu, die aufruft AddHostObjectToScript
:
Erweitern Sie in Projektmappen-Explorer das Standard-Projekt, z. B. MyUWPGetStartApp, erweitern Sie MainPage.xaml, und wählen Sie dann MainPage.xaml.cs aus.
Fügen Sie unterhalb des
MainPage
Konstruktors die folgendeInitializeWebView2Async
Methode hinzu:private async void InitializeWebView2Async() { await WebView2.EnsureCoreWebView2Async(); var dispatchAdapter = new WinRTAdapter.DispatchAdapter(); WebView2.CoreWebView2.AddHostObjectToScript("Windows", dispatchAdapter.WrapNamedObject("Windows", dispatchAdapter)); }
Diese Methode ruft auf
AddHostObjectToScript
.In der Zeile
AddHostObjectToScript("Windows", ...
Windows
ist der Namespace der obersten Ebene. Wenn Sie über andere Namespaces der obersten Ebene verfügen, können Sie zusätzliche Aufrufe fürAddHostObjectToScript
hinzufügen, wie im folgenden Beispiel:WebView2.CoreWebView2.AddHostObjectToScript("RuntimeComponent1", dispatchAdapter.WrapNamedObject("RuntimeComponent1", dispatchAdapter));
Der
WrapNamedObject
Aufruf erstellt ein Wrapperobjekt für denRuntimeComponent1
Namespace. DerAddHostObjectToScript
Aufruf fügt das umschlossene Objekt dem Skript mit dem NamenRuntimeComponent1
hinzu.Eine vollständige Anleitung zur Verwendung benutzerdefinierter WinRT-Komponenten finden Sie weiter unten unter Benutzerdefinierte WinRT-Komponenten von Drittanbietern.
Fügen Sie im
MainPage
Konstruktor untenthis.InitializeComponent();
den folgenden Code hinzu:InitializeWebView2Async();
Klicken Sie mit der rechten Maustaste auf das Standard Projekt, z. B. MyUWPGetStartApp, und wählen Sie dann Als Startprojekt festlegen aus. Fett zeigt das Startprojekt an.
Wählen Sie Datei>Alle speichern (STRG+UMSCHALT+S) aus.
Drücken Sie F5 , um die Beispiel-App auszuführen. Die WebView2-fähige WinUI 2-App (UWP) wird geöffnet:
Der webseitige Code der Host-App (und die DevTools-Konsole) kann jetzt Methoden und Eigenschaften der angegebenen Namespaces oder Klassen des Hostobjekts aufrufen.
Schritt 9: Aufrufen von Methoden und Eigenschaften für das Hostobjekt aus webseitigem JavaScript
Zugreifen auf projizierte APIs über die DevTools-Konsole
Verwenden Sie als Nächstes die DevTools-Konsole, um zu veranschaulichen, dass webseitiger Code die hostseitigen APIs aufrufen kann, die im wv2winrt-Tool (webView2 WinRT JS Projection Tool) angegeben wurden:
Wenn die App nicht ausgeführt wird, drücken Sie in Visual Studio F5 , um die Beispiel-App auszuführen.
Klicken Sie auf den Standard Teil des WebView2-Beispiel-App-Fensters, um den Fokus zu geben, und drücken Sie dann STRG+UMSCHALT+I, um Microsoft Edge DevTools zu öffnen. Oder klicken Sie mit der rechten Maustaste auf die Seite, und wählen Sie dann Untersuchen aus.
Das Fenster Microsoft Edge DevTools wird geöffnet.
Wenn das Microsoft Edge DevTools-Fenster nicht angezeigt wird, drücken Sie ALT+TAB , um es anzuzeigen.
Wählen Sie im Fenster DevTools die Registerkarte Konsole aus.
Klicken Sie auf die Schaltfläche Konsole löschen (), oder klicken Sie mit der rechten Maustaste auf die Konsole , und wählen Sie dann Konsole löschen aus. Nachrichten werden in regelmäßigen Abständen in der Konsole angezeigt.
Fügen Sie in der DevTools-Konsole den folgenden Windows.Globalization.Language-Klassencode ein, und drücken Sie dann die EINGABETASTE:
const Windows = chrome.webview.hostObjects.sync.Windows; (new Windows.Globalization.Language("en-US")).displayName;
Die Konsole gibt eine Sprachnamenzeichenfolge aus, z
English (United States)
. B. , die zeigt, dass der hostseitige (systemeigene) Code Ihrer App aus webseitigem JavaScript-Code aufgerufen werden kann:Versuchen Sie, die Klammern wegzulassen. Geben Sie in der DevTools-Konsole die folgende Anweisung ein:
new Windows.Globalization.Language("en-US").displayName;
Die Konsole gibt eine Sprachnamenzeichenfolge aus, z
English (United States)
. B. .Auf ähnliche Weise können Sie auf Windows.System.UserProfile Namespace-Member zugreifen.
Schließen Sie das Fenster DevTools.
Schließen Sie die App.
Herzlichen Glückwunsch! Sie haben die Beispieldemonstration zum Aufrufen von WinRT-Code aus JavaScript-Code abgeschlossen.
Zugreifen auf projizierte APIs über Quellcodedateien
Oben haben wir die DevTools-Konsole verwendet, um JavaScript-Anweisungen auszuführen, die auf das projizierte Hostobjekt zugreifen. Ebenso können Sie aus Quellcodedateien auf das projizierte Hostobjekt zugreifen. Führen Sie dazu zunächst Setupcode für das Skript aus:
// early in setup code:
const Windows = chrome.webview.hostObjects.sync.Windows;
Anschließend fügen Sie im Standard Textkörper Ihres Codes Aufrufe zu projizierten Objekten hinzu, wie im Folgenden gezeigt:
(new Windows.Globalization.Language("en-US")).displayName;
Auf ähnliche Weise können Sie auf API-Member zugreifen Windows.System.UserProfile
.
Dies ist das Ende der Tutorialschritte. Die folgenden Abschnitte enthalten allgemeine Informationen zu WebView2 WinRT-Apps.
Benutzerdefinierte WinRT-Komponenten (Drittanbieter)
Das wv2winrt-Tool (das WebView2 WinRT JS-Projektionstool) unterstützt benutzerdefinierte WinRT-Komponenten von Drittanbietern, zusätzlich zu Den WinRT-APIs des Erstanbieterbetriebssystems.
Um benutzerdefinierte WinRT-Komponenten (Drittanbieter) mit dem wv2winrt-Tool zu verwenden, führen Sie zusätzlich zu den oben genannten Schritten auch die folgenden Schritte aus:
Fügen Sie ihrer Visual Studio-Projektmappe, die Ihre WinRT-Klasse implementiert, ein drittes Projekt (außer Ihrem Standard-App- und WinRTAdapter-Projekt) hinzu.
Lassen Sie das WinRTAdapter-Projekt "Verweis hinzufügen" auf Ihr neues drittes Projekt, das Ihre WinRT-Klasse enthält, verwenden.
Aktualisieren Sie den Include-Filter des WinRTAdapter-Projekts in den Eigenschaften, um auch Ihre neue Klasse einzuschließen.
Fügen Sie eine zusätzliche Zeile zu hinzu, um
InitializeWebView2Async
den Namespace Ihrer winrt-Klasse hinzuzufügen:WebView2.CoreWebView2.AddHostObjectToScript("MyCustomNamespace", dispatchAdapter.WrapNamedObject("MyCustomNamespace", dispatchAdapter));
Für einfache Methodenaufrufe aus dem Web fügen Sie optional Ihren Namespacesynchronisierungsproxy als globales Objekt im Skript hinzu. Beispiel:
window.MyCustomNamespace = chrome.webview.hostObjects.sync.MyCustomNamespace;
Ein Beispiel hierfür finden Sie im folgenden WebView2-Beispiel:
- uwp-wv2winrt-custom-csharp-winrt : Ein Beispiel als Branch.
Asynchrone WinRT-Methoden
Wenn Sie die Schritte in der obigen Anleitung befolgen, sollten Sie synchrone Proxys verwenden können. Für asynchrone Methodenaufrufe müssen Sie verwenden chrome.webview.hostObjects.options.forceAsyncMethodMatches
.
Die forceAsyncMethodMatches
-Eigenschaft ist ein Array von regulären Ausdrücken. Wenn ein regex mit einem Methodennamen in einem Synchronisierungsproxy übereinstimmt, wird die Methode stattdessen asynchron ausgeführt. Wenn Sie diese Einstellung auf [/Async$/]
festlegen, entspricht sie einer beliebigen Methode, die mit dem Suffix Async
endet. Dann funktionieren übereinstimmende Methodenaufrufe wie eine Methode für einen asynchronen Proxy und geben eine Zusage zurück, die Sie erwarten können.
Beispiel:
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/'));
Weitere Informationen finden Sie in der Zeile in CoreWebView2.AddHostObjectToScript-MethodeforceAsyncMethodMatches
.
Abonnieren von WinRT-Ereignissen
WinRT-Ereignisse werden auch über die Skriptproxys verfügbar gemacht. Sie können Ereignishandler von instance WinRT-Ereignissen und statischen WinRT-Ereignissen mithilfe der addEventListener(string eventName, function handler)
Methoden und hinzufügen und removeEventListener(string eventName, function handler)
entfernen.
Diese Methoden funktionieren ähnlich wie die DOM-Methoden mit demselben Namen. Rufen Sie addEventListener
mit einem Zeichenfolgennamen des WinRT-Ereignisses auf, das Sie als ersten Parameter abonnieren möchten, und einem Funktionsrückruf, der aufgerufen wird, wenn das Ereignis ausgelöst wird. Das Aufrufen removeEventListener
mit denselben Parametern gekündigt das Ereignis. Beispiel:
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);
});
Für ein WinRT-Ereignis, das Ereignisargumente bereitstellt, werden diese als erster Parameter für die Ereignishandlerfunktion bereitgestellt. Beispielsweise verfügt das Ereignis über IMapChangedEventArgs<string, object>
ein Windows.Foundation.Collections.PropertySet.MapChanged
Ereignis-ARG-Objekt, und dieses Objekt wird als Parameter für den Rückruf bereitgestellt.
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;
// ...
});
Das Ereignis-Args-Objekt verfügt zusätzlich über die folgenden Eigenschaften:
Eigenschaftenname | Beschreibung |
---|---|
target |
Das Objekt, das das Ereignis ausgelöst hat |
type |
Der Zeichenfolgenname des Ereignisses |
detail |
Ein Array aller Parameter, die für den WinRT-Delegaten bereitgestellt werden |
Festlegen, dass AddHostObjectToScript-JavaScript-Proxys mehr wie andere JavaScript-APIs wirken
AddHostObjectToScript
standardmäßig asynchrone und ausführliche Proxys verwenden, aber Sie können festlegen, dass die AddHostObjectToScript
JavaScript-Proxys wie andere JavaScript-APIs agieren. Weitere Informationen zu AddHostObjectToScript
und dem Standardverhalten finden Sie unter AddHostObjectToScript. Wenn Sie eine Host-App von der JavaScript-WinRT-Projektion in JavaScript-UWP-Apps oder aus der EdgeHTML-basierten WebView migrieren, sollten Sie den folgenden Ansatz verwenden, um dem vorherigen Verhalten besser gerecht zu werden.
Legen Sie die folgenden Eigenschaften fest, damit die AddHostObjectToScript
JavaScript-Proxys mehr wie andere JavaScript-APIs agieren:
chrome.webview.hostObjects.option.defaultSyncProxy
- Proxys können entweder asynchron oder synchron sein. Normalerweise wissen wir beim Aufrufen einer Methode für einen synchronen Proxy, dass das Ergebnis auch ein synchroner Proxy sein sollte. In einigen Fällen geht dieser Kontext jedoch verloren, z. B. wenn ein Verweis auf eine Funktion auf nativen Code bereitgestellt wird, und dann später nativer Code, der diese Funktion aufruft. In diesen Fällen ist der Proxy asynchron, es sei denn, diese Eigenschaft ist festgelegt.chrome.webview.hostObjects.options.forceAsyncMethodMatches
– Dies ist ein Array von regulären Ausdrücken. Wenn Sie eine Methode für einen synchronen Proxy aufrufen, wird der Methodenaufruf tatsächlich asynchron ausgeführt, wenn der Methodenname mit einer Zeichenfolge oder einem regulären Ausdruck in diesem Array übereinstimmt. Wenn Sie diesen Wert auf [/Async$/] festlegen, wird jede Methode, die mitAsync
endet, zu einem asynchronen Methodenaufruf. Wenn eine asynchrone Methode hier nicht übereinstimmt und nicht gezwungen wird, asynchron zu sein, wird die Methode synchron aufgerufen, wodurch die Ausführung des aufrufenden JavaScript blockiert und dann die Auflösung der Zusage zurückgegeben wird, anstatt eine Zusage zurückzugeben.chrome.webview.hostObjects.options.ignoreMemberNotFoundError
- Wenn Sie versuchen, den Wert einer Eigenschaft eines Proxys abzurufen, und die Eigenschaft in der entsprechenden nativen Klasse nicht vorhanden ist, erhalten Sie eine Ausnahme . Es sei denn, Sie legen diese Eigenschaft auftrue
fest. In diesem Fall stimmt das Verhalten mit dem Chakra WinRT-Projektionsverhalten (und dem allgemeinen JavaScript-Verhalten) überein und gibt ohne Fehler zurückundefined
.
Die Chakra WinRT-Projektion platziert die WinRT-Namespaces direkt auf dem Stammobjekt. Im Gegensatz dazu:
-
AddHostObjectToScript
platziert asynchrone Stammproxys aufchrome.webview.hostObjects
. -
AddHostObjectToScript
platziert Synchronisierungsstammproxys aufchrome.webview.hostObjects.sync
.
Um auf Stammproxys zuzugreifen, wo Chakra WinRT-Projektionscode erwarten würde, können Sie dem Stammobjekt die WinRT-Namespacespeicherorte des Stammproxys zuweisen. Beispiel:
window.Windows = chrome.webview.hostObjects.sync.Windows;
Um sicherzustellen, dass das JavaScript, das all dies festlegt, vor allem ausgeführt wird, können Sie entweder die obige Anweisung zu Ihrem JavaScript hinzufügen oder WebView2 anweisen, die obige Anweisung für Sie einzufügen, bevor Sie ein anderes Skript ausführen, indem Sie die CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync
-Methode verwenden.
Im folgenden Beispiel werden die oben genannten Techniken veranschaulicht:
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;" +
"}" +
"})();");
Abrufen von Informationen zu WebView2-Eigenschaften
Informationen zu WebView2-Eigenschaften sind an zwei Stellen verfügbar:
- Eigenschaftenseiten des WinRTAdapter-Projekts.
-
wv2winrt.exe
Befehlszeilenhilfe. Dies ist das wv2winrt-Tool (webView2 WinRT JS Projection Tool).
Eigenschaftenseiten des WinRTAdapter-Projekts
Klicken Sie in den Eigenschaftenseiten des WinRTAdapter-Projekts auf eine Eigenschaftenzeile, um Hilfe zu einer Eigenschaft zu benötigen. Die Hilfe wird am unteren Rand des Dialogfelds angezeigt:
Befehlszeilenhilfe für wv2winrt.exe Eigenschaften
Die Befehlszeilenhilfe für wv2winrt.exe
enthält Informationen zu den Parametern des wv2winrt-Tools (webView2 WinRT JS Projection Tool). Beispiel:
Parameter | Beschreibung |
---|---|
verbose |
Listen Sie einige Inhalte auf, die standardmäßig festgelegt werden sollen, einschließlich der erstellten Dateien und Informationen zu den Ein- und Ausschlussregeln. |
include |
Die Liste wie oben schließt Standardmäßig Namespaces und Laufzeitklassen mit Ausnahme der aufgeführten aus. Die include-Deklarationen können entweder Namespaces sein, die alles in diesem Namespace enthalten, oder Laufzeitklassennamen, die nur diese Runtimeklasse enthalten. |
use-javascript-case |
Ändert den generierten Code, um Methodennamen, Eigenschaftsnamen usw. zu erzeugen, die den gleichen Groß-/Kleinschreibungsstil wie die Chakra JavaScript WinRT-Projektion verwenden. Standardmäßig werden Namen generiert, die dem Winrt entsprechen. |
output-path |
Legt den Pfad fest, in den generierte Dateien geschrieben werden. |
output-namespace |
Legt den Namespace fest, der für die generierte WinRT-Klasse verwendet werden soll. |
winmd-paths |
Eine durch Leerzeichen getrennte Liste aller winmd-Dateien, die für die Codegenerierung untersucht werden sollen. |
Siehe auch
Tutorial und Beispiel:
- Erste Schritte mit WinUI 2-Apps (UWP): Tutorial: Schritte zum Erstellen einer App mit WebView2 mithilfe einer Projektvorlage.
- WinUI 2-Beispiel-App (UWP): Beispiel: Schritte zum Herunterladen, Erstellen, Ausführen und Aktualisieren des Beispiels.
API-Referenz:
- WinRT: CoreWebView2.AddHostObjectToScript-Methode
- Win32: ICoreWebView2::AddHostObjectToScript-Methode
- .NET: CoreWebView2.AddHostObjectToScript-Methode
.NET-gleichwertiger Artikel:
- Aufrufen von systemeigenem Code aus webseitigem Code – deckt Win32/C++ ab und behandelt auch einige Aspekte von .NET/C# innerhalb von Frames.