Web 側のコードからネイティブ側の WinRT コードを呼び出すときに、WebView2 アプリの Web 側の JavaScript コード内から WinRT 型とメンバーを使用する方法を次に示します。
言語に相当する言語
WebView2 WinRT JS プロジェクション ツール (wv2winrt) は、次のように WinRT から JavaScript 言語コンストラクトに変換します。
| WinRT 言語コンストラクト | JavaScript 表現 | Notes (メモ) |
|---|---|---|
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 |
UUID の文字列表現 (区切り{}記号と中かっこの有無にかかわらず) を含む JavaScript String インスタンスは、対応する 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 オブジェクト | 名前空間は、任意の子名前空間、列挙型、または RuntimeClassのプロパティを持つ JavaScript オブジェクトとして表されます。 名前空間には、0、1、または多数の子名前空間、列挙型、またはランタイムクラスがあり、個々の子名前空間、列挙型、ランタイムクラスはそれぞれ独自のプロパティを取得します。 |
Class |
JavaScript オブジェクト |
RuntimeClassクラスは、同じメソッド、プロパティ、およびイベントを持つ JavaScript オブジェクトに変換されます。 |
Interface |
JavaScript オブジェクト |
RuntimeClassインターフェイスは、同じメソッド、プロパティ、およびイベントを持つ JavaScript オブジェクトに変換されます。 JavaScript でのインターフェイスの実装はサポートされません。 |
| クラスの静的メンバー | JavaScript オブジェクト プロパティ | 以下を参照してください。 |
| クラス コンストラクター | JavaScript コンストラクターと関数 | 以下を参照してください。 |
JavaScript オブジェクトをホスト オブジェクトに渡す場合:
- JavaScript
Dateオブジェクトを としてVT_DATEホスト オブジェクトに渡す必要がある場合は、ホスト オブジェクトのshouldSerializeDatesプロパティを にtrue設定します。 既定では、Dateを使用JSON.stringifyして、 オブジェクトが としてstringホストに渡されます。 - JavaScript 型の配列を として
arrayホスト オブジェクトに渡す必要がある場合は、ホスト オブジェクトのshouldPassTypedArraysAsArraysプロパティを にtrue設定します。 既定では、型指定された配列は としてIDispatchホストに渡されます。
関連項目:
クラスの静的メンバー
静的プロパティ、静的メソッド、または静的イベントを持つランタイム クラスは、名前空間のプロパティとして表されます。 各静的プロパティ、静的メソッド、および静的イベントは、ランタイム クラスのその JavaScript オブジェクトのプロパティとして表されます。
たとえば、WinRT API 静的メソッド Windows.Foundation.Uri.EscapeComponentの場合:
-
Windows.Foundationは名前空間です。 -
Uriは runtimeclass です。 -
EscapeComponentは静的メソッドです。
JavaScript では、表現は次のようになります chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent。
-
EscapeComponentは、ランタイム クラスの JavaScript オブジェクトUriのプロパティである JavaScript メソッドです。 -
Uriruntimeclass は、名前空間の JavaScript オブジェクトのFoundationプロパティです。
たとえば、静的メソッド Windows.Foundation.Uri.EscapeComponentを呼び出すには、 を呼び出します。
`chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent("example");`
ここでの JavaScript 名前空間オブジェクトは です chrome.webview.hostObjects.Windows.Foundation。
クラス コンストラクター
クラスの RuntimeClass コンストラクターは、次の 2 つの方法で呼び出すことができる 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 からそのメソッドを呼び出すときに、返される結果は、各 out パラメーターのプロパティである JavaScript オブジェクトになります。 メソッドに戻り値以外のvoid 型がある場合、返される結果オブジェクトには、 メソッドの戻り値を含む という名前 value のプロパティもあります。
パラメーターを持つ out WinRT メソッドを呼び出すと、(配列型でない限り) メソッド呼び出しのパラメーター リストでパラメーター out がスキップされます。 たとえば、パラメーターを持ち、戻り値以外のvoid型を持つ out WinRT メソッドが MIDL3 を使用して次のように定義されるとします。
String MethodWithOutParams(String stringParam1,
out Int32 intParam2,
out Int32 intParam3,
String stringParam4);
JavaScript からそのメソッドを呼び出す場合は、引数を out 省略します。
let result = object.MethodWithOutParams("stringParam1",
"stringParam4");
次に、WinRT メソッドの戻り値を読み取るために、JavaScript result オブジェクトの value プロパティを読み取ります。 WinRT メソッドの out パラメーターを読み取るために、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 パラメーターとして渡す場合は、 chrome.webview.hostObjects.options.shouldPassTypedArraysAsArrays を に設定する true必要があります。
関連項目:
- C++ WinRT での WebView2 SDK と Windows App SDK (WinUI3) に関する問題 #2788