Представление типов и членов WinRT в JavaScript
Вот как использовать типы и члены WinRT из веб-кода JavaScript в приложении WebView2 при вызове собственного кода WinRT из веб-кода.
Эквиваленты языков
Средство проекции WinRT JS в WebView2 (wv2winrt) преобразует из WinRT в языковые конструкции JavaScript следующим образом.
Конструкция языка WinRT | Представление JavaScript | Примечания |
---|---|---|
UInt8 , Int16 , UInt16 , Int32 , UInt32 , Int64 , UInt64 , Single , Double |
Number |
|
Char , String |
String |
Экземпляр JavaScript String преобразуется в экземпляр WinRT String . |
Boolean |
Boolean |
|
Windows.Foundation.DateTime Структура |
Date |
|
Windows.Foundation.TimeSpan Структура |
Number |
|
Guid |
String |
Экземпляр JavaScript String , содержащий строковое представление UUID (с разделителями { и } фигурными скобками или без нее), преобразуется в соответствующий UUID. UUID преобразуется в строковое представление с разделителями { и } фигурными скобками в начале и конце. Сведения о UUID см. в статье RFC 4122. |
IVector<T> , IVectorView<T> , IObservableVector<T> |
Array и объект JavaScript |
RuntimeClass Если экземпляр реализует vector интерфейсы, он представляется в JavaScript как обычный объект, описанный ниже, но также будет действовать как массив JavaScript. Операции чтения и записи выполняются в реальном времени для базового векторного объекта WinRT. |
IMap<K,V> , IMapView<K,V> , IObservableMap<K,V> |
Объект JavaScript |
RuntimeClass Если экземпляр реализует map интерфейсы, он представлен в JavaScript как обычный объект, описанный ниже, но также имеет свойства с именем и значениями из базового объекта карты WinRT. Операции чтения и записи выполняются в режиме реального времени для базового объекта карты WinRT. |
Enum |
Объект JavaScript | Тип перечисления представлен в виде объекта JavaScript. Каждое значение перечисления является свойством Number объекта JavaScript. |
Struct |
Объект JavaScript | Тип Struct преобразуется в объект JavaScript с именами свойств, которые соответствуют именам Struct членов типа. Это двустороннее преобразование. |
Namespace |
Объект JavaScript | Пространство имен представлено как объект JavaScript, имеющий свойство для любых дочерних пространств имен, типов перечисления или RuntimeClass . Пространство имен может иметь 0, 1 или много дочерних пространств имен, перечислений или классов среды выполнения, и каждое отдельное дочернее пространство имен, перечисление и класс среды выполнения получает собственное свойство. |
Class |
Объект JavaScript | Класс RuntimeClass преобразуется в объект JavaScript с одинаковыми методами, свойствами и событиями. |
Interface |
Объект JavaScript | Интерфейс RuntimeClass преобразуется в объект JavaScript с теми же методами, свойствами и событиями. Реализация интерфейса в JavaScript не поддерживается. |
Статический член класса | Свойство объекта JavaScript | См. ниже. |
Конструктор класса | Конструктор и функция JavaScript | См. ниже. |
При передаче объектов JavaScript в объекты размещения:
- Если объекты JavaScript
Date
необходимо передать в объекты узла какVT_DATE
, задайте для свойства ведущего объектаshouldSerializeDates
значениеtrue
. По умолчаниюDate
объекты передаются в узел какstring
, используя .JSON.stringify
- Если типизированные массивы JavaScript должны передаваться в объекты узла как
array
, задайте свойству объектаshouldPassTypedArraysAsArrays
узла значениеtrue
. По умолчанию типизированные массивы передаются в узел какIDispatch
.
См. также:
Статические члены класса
Класс среды выполнения со статическими свойствами, статическими методами или статическими событиями представлен как свойство пространства имен. Каждое статическое свойство, статический метод и статическое событие представлено как свойство для этого объекта JavaScript класса среды выполнения.
Например, для статического метода Windows.Foundation.Uri.EscapeComponent
API WinRT :
-
Windows.Foundation
— это пространство имен. -
Uri
— класс среды выполнения. -
EscapeComponent
— статический метод.
В JavaScript представление выглядит примерно так: : chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent
-
EscapeComponent
— это метод JavaScript, который является свойством объекта JavaScript дляUri
класса среды выполнения. - Класс
Uri
среды выполнения — это свойство объекта JavaScript дляFoundation
пространства имен.
Например, чтобы вызвать статический метод Windows.Foundation.Uri.EscapeComponent
, вызовите:
`chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent("example");`
Объект пространства имен JavaScript здесь имеет значение chrome.webview.hostObjects.Windows.Foundation
.
Конструкторы классов
Конструктор класса RuntimeClass
представлен в виде одного свойства объекта JavaScript, которое можно вызвать двумя способами:
- Как конструктор объекта пространства имен JavaScript.
- Как функция для объекта пространства имен JavaScript.
Например, чтобы создать новый Windows.Foundation.Uri
объект, можно вызвать его в качестве конструктора, используя new
:
`let uri = new chrome.webview.hostObjects.Windows.Foundation.Uri("https://example.com/");`
Или вызовите его как функцию без new
:
`let uri = chrome.webview.hostObjects.Windows.Foundation.Uri("https://example.com/");`
Объект пространства имен JavaScript здесь имеет значение chrome.webview.hostObjects.Windows.Foundation
.
Перегрузки методов
Если имя метода WinRT перегружено для нескольких методов, вызов этого имени метода из JavaScript вызовет перегрузку с соответствующим числом параметров.
Если существует несколько перегрузок с соответствующим числом параметров, будет вызвана первая перегрузка, найденная в метаданных.
Параметры выхода метода
Если метод WinRT имеет out
параметры, то при вызове этого метода из JavaScript возвращаемым результатом будет объект JavaScript, который является свойством для каждого out
параметра. Если метод имеет тип, отличный от возвращаемогоvoid
значения, то возвращаемый результирующий объект также будет иметь свойство с именем value
, которое содержит возвращаемое значение метода.
При вызове метода WinRT с out
параметрами все out
параметры пропускаются в списке параметров в вызове метода (если они не относятся к типу массива). Например, предположим, что метод WinRT с out
параметрами и типом, неvoid
возвращаемым, определен следующим образом с помощью MIDL3:
String MethodWithOutParams(String stringParam1,
out Int32 intParam2,
out Int32 intParam3,
String stringParam4);
При вызове этого метода из JavaScript опустите out
аргументы:
let result = object.MethodWithOutParams("stringParam1",
"stringParam4");
Затем, чтобы прочитать возвращаемое значение метода WinRT, считайте value
свойство объекта JavaScript result
. Чтобы прочитать параметры метода out
WinRT, прочитайте соответствующие именованные свойства объекта JavaScript result
:
console.assert(result.value == "return value");
console.assert(result.intParam2 == 1);
console.assert(result.intParam3 == 2);
Для параметров типа out
массива массив необходимо передать в список параметров метода при вызове метода. Для типа, отличного от возвращаемогоvoid
значения, результирующий массив заменит массив, переданный для вызова метода. Для возвращаемого void
типа результирующий массив будет результатом вызова метода.
// Both methods update input array values to index values
String NonVoidMethodWithArrayOutParam(out Int[] intArrayParam);
Void VoidMethodWithArrayOutParam(out Int[] intArrayParam);
let input_array1 = [0, 0, 0];
let result1 = object.NonVoidMethodWithArrayOutParam(input_array1);
console.assert(input_array1 == [0, 1, 2])
let input_array2 = [0, 0, 0];
let result2 = object.VoidMethodWithArrayOutParam(input_array2);
console.assert(result2 == [0, 1, 2]);
При передаче типизированных массивов в качестве параметров массива out
необходимо задать значение true
. chrome.webview.hostObjects.options.shouldPassTypedArraysAsArrays
См. также:
- Проблема No 2788 о пакете SDK для WebView2 и пакете SDK для приложений Windows (WinUI3) в C++ WinRT