Web 側コードからネイティブ側 WinRT コードを呼び出す

Web 側の JavaScript コードでは、 wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) を利用して、ネイティブ側の WinRT メソッドとプロパティにアクセスできます。 wv2winrt ツールは、JavaScript コードに必要なコード ファイルを生成し、次のような任意の WinRT API のメソッドとプロパティを使用できるようにします。

  • WebView2 ホスト アプリの WinRT API。
  • Windows WinRT API。
  • サードパーティの WinRT API。

Web 側の JavaScript コードで WinRT ホスト アプリのメソッドおよびプロパティにアクセスする理由の詳細については、「 Web 側コードからネイティブ側コードを呼び出す」の概要を参照してください。

WinRT と .NET で異なるアプローチを使用する理由

この記事は、WinRT WebView2 API 用であり、.NET WebView2 API 用ではありません。 この記事の C# コードは、.NET WebView2 API 用にビルドされますが、実行されません。 この記事の .NET WebView2 API 用の C# コードを使用して AddHostObjectToScript を呼び出すと、エラー メッセージが表示されます。

WinRT は WinRT オブジェクトを動的に検査して操作するための IDispatch や、WebView2 の Win32 および .NET プラットフォームがサポートしているその他のメカニズムをサポートしていないため、WinRT オブジェクトを投影する場合は、wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) が必要です。 .NET で AddHostObjectToScript を使用する方法については、この記事ではなく 「Web 側コードからネイティブ側コードを呼び出す」 を参照してください。

WinUI 3 と WinUI 2 のセットアップの違い

WinRT WebView2 アプリが WinUI 2 (UWP) ではなく WinUI 3 (Windows アプリ SDK) を対象とする場合、以下で説明する WinUI 3 固有の手順の概要を次に示します。

  • パッケージ化されていないアプリでは、記事「Windows ランタイム コンポーネントを使用してパッケージ化されていないデスクトップ アプリを強化する」にある追加の手順を実行する必要があります。

  • CsWinRTIncludesにWinRTAdapterを追加します。

  • WinUI 3 (Windows アプリ SDK) アプリの場合、メイン アプリ プロジェクトには WebView2 SDK ファイルの独自のコピーが直接含まれている WinAppSDK への参照があるため、メイン アプリ プロジェクトに WebView2 SDK への参照を含めると、エラー メッセージが生成されません。

  • プロジェクト アダプターのバージョンは一致している必要はありません。

  • Visual Studio 2022 Community Edition の "既定" オプションをインストールした後、Visual Studio インストーラーで .NET カードをクリックし、右側で [Windows アプリ SDK C# テンプレート] のチェック ボックスをオンにします。

  • それでも正しいプロジェクト テンプレートが表示されない場合: Visual Studio インストーラーで、UWP カードをクリックして選択し、右側の [v143 C++ ツール] チェック ボックスをオンにして、[変更] ボタンをクリックします。

この例の戦略と最終目標

戦略

この記事では、次の主な手順について説明します。

  1. wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) の WinRTAdapter プロジェクトを作成します。

  2. この例では、プロジェクション用に次のホスト側 API を指定します。

  3. wv2winrt ツールを実行して、選択した名前空間またはクラスの C++/WinRT ソース コードを生成します。

  4. メインの WinUI プロジェクトで AddHostObjectToScript を呼び出します。

  5. ホスト オブジェクトのメソッドとプロパティを Web 側の JavaScript コード (または DevTools コンソール) から呼び出します。

最終目標

まず、JavaScript コードから呼び出す WinRT API をいくつか選択します。 この例では、Windows.Globalization 名前空間にある WinRT Language クラスを、Windows UWP アプリケーション用に使用します。 Windows.Globalization.Language クラスを使用すると、クライアントのネイティブ OS から言語情報を取得できます。

WebView2 ホスト アプリでは、Web 側の JavaScript コードは、ネイティブ側コードに含まれる Language オブジェクトのメソッドとプロパティにアクセスできます。

DevTools コンソールを使用して、投影された API にアクセスする

このチュートリアル例の最後には、Microsoft Edge DevTools のコンソールを使用して、Language クラスのホストの displayName プロパティの読み取りをテストします。

const Windows = chrome.webview.hostObjects.sync.Windows;
(new Windows.Globalization.Language("en-US")).displayName;

その後、DevTools コンソールから English (米国)または別の言語の表示名が出力され、Web 側の JavaScript コードからネイティブ側のコードを呼び出したことを示します。

DevTools コンソールを使用して、Web 側コードからネイティブ側コードの呼び出しをテストする

同様に、Windows.System.UserProfile 名前空間のメンバーにもアクセスできます。

ソース コード ファイルを介して投影された API にアクセスする

同様に、DevTools コンソールではなくソース コード ファイル内で、投影されたホスト オブジェクトにアクセスできます。 まず、スクリプトのセットアップ コードを実行します。

// early in setup code:
const Windows = chrome.webview.hostObjects.sync.Windows;

次に、コードの本文で、次のように投影オブジェクトへの呼び出しを追加します。

(new Windows.Globalization.Language("en-US")).displayName;

同様に、Windows.System.UserProfile 名前空間のメンバーにもアクセスできます。

では、始めましょう。

手順 1: 基本的な WebView2 プロジェクトを作成または取得する

Visual Studio のインストール

  • Visual Studio 2015 以降がまだインストールされていない場合は、別のウィンドウまたはタブで、「WebView2 の開発環境を設定する」で「Visual Studio のインストール」を参照してください。 そのセクションの手順に従って、このページに戻って以下の手順に進みます。 この記事では、Visual Studio Community Edition 2022 のスクリーンショットを示します。

Microsoft Edge のプレビュー チャネルをインストールする

  • Microsoft Edge のプレビュー チャネル (Beta、Dev、または Canary) がまだインストールされていない場合は、別のウィンドウまたはタブで、「WebView2 の開発環境を設定する」で「Microsoft Edge のプレビュー チャネルをインストールする」を参照してください。 そのセクションの手順に従って、このページに戻って以下の手順に進みます。

基本的な WebView2 プロジェクトを作成または開く

  1. 次のいずれかの方法を実行して、WebView2 コントロールを埋め込む WebView2 コードが 2 行含まれるベースライン スターター プロジェクトを取得します。

    • 提供されたベースライン サンプル ソリューションを使用します。 まだ行っていない場合は、 WebView2Samples リポジトリをローカル ドライブに複製またはダウンロードします。 別のウィンドウまたはタブで、「WebView2 の開発環境を設定する」の「WebView2Samples リポジトリのダウンロード」を参照してください。 そのセクションの手順を実行し、このページに戻り、以下に進みます。 この方法では、 https://github.com/MicrosoftEdge/WebView2Samples/tree/main/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln のローカル コピーを使用します。

    • Visual Studio でプロジェクト テンプレートを使用して、基本的な UWP アプリを作成し、WebView2 コントロールを追加します。 「 WinUI 2 (UWP) アプリでの WebView2 の使用を開始する 」の手順を実行して、WebView2 コントロールを埋め込む WebView2 コードを 2 行含むベースライン スターター プロジェクトを作成します。

    • 既存のコード ベースを使用します。 独自のアプリ コード ベースが既にある場合は、そのプロジェクトを Visual Studio で開くことができます。

  2. ローカル ドライブで、サンプル リポジトリ ソリューションなど、上記で入手した .sln ファイルを開きます。

    • <your-repos-directory>/WebView2Samples-main/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln
    • <your-repos-directory>/WebView2Samples/GettingStartedGuides/WinUI2_GettingStarted/MyUWPGetStartApp.sln

    サンプル ソリューションが Visual Studio で開きます。

    wv2winrt ツール用の新しいプロジェクトの追加

  3. Visual Studio で、[デバッグ>デバッグの開始] を選択します。 これによりプロジェクトがビルドされ、プロジェクトのベースライン バージョンが実行されます。 MyUWPGetStartApp ウィンドウなどのベースライン アプリが開きます。

    WebView2 WinUI 2 UWP サンプル ウィンドウ

    表示されているのは、WebView コントロールが追加された WinUI 2 (UWP) アプリで、最初に Bing.com に移動するように設定されています。 これは、「 WinUI 2 (UWP) アプリでの WebView2 の使用を開始する」の手順を実行した結果のアプリです。

  4. アプリ ウィンドウを閉じます。

手順 2: wv2winrt ツール用の WinRTAdapter プロジェクトを追加する

次に、wv2winrt ツール用の WinRTAdapter プロジェクト (WebView2 WinRT JS プロジェクション ツール) を作成します。 このプロジェクトでは、ツールの実行によって生成されたコードからライブラリをビルドします。 この生成されたコードにより、WinRT API を WebView2 コントロールで公開できます。

次の手順に従い、 wv2winrt ツール用のプロジェクトを追加します。

  1. Visual Studio で、前の手順で作成した WinUI プロジェクトを開きます。

  2. ソリューション エクスプローラー で、ソリューション (プロジェクトではなく) を右クリックし、[プロジェクトの追加>新しいプロジェクト] を選択します。 [ 新しいプロジェクトの追加 ] ダイアログが開きます。

  3. [検索] テキスト ボックスに「Windows ランタイム コンポーネント (C++/WinRT)」と入力します。

    代替アプローチ:以下の番号付き手順で説明されているように、Windows ランタイム コンポーネント (C++/WinRT) のプロジェクト テンプレートを使用してプロジェクトを追加しない場合は、「UWP アプリケーション> C++/WinRT の概要」の手順に従って、代わりにユニバーサル Windows プラットフォーム開発ワークロードをインストールする必要があります。

  4. Windows ランタイム コンポーネント (C++/WinRT) カードを選択し、[次へ] ボタンをクリックします。

    [新しいプロジェクトの追加] ダイアログで Windows ランタイム コンポーネント (C++/WinRT) カードを選択する

    メモ: テンプレートの名前に "C++/WinRT" が含まれていることを確認します。 このテンプレートが一覧にない場合は、Visual Studio インストーラー内からユニバーサル Windows プラットフォーム開発ワークロードをインストールします。 Visual Studio 2019 を使用していてテンプレートが見つからない場合は、「Visual Studio > 拡張機能」>「拡張機能の管理」から VS2019 用の C++/WinRT テンプレートとビジュアライザーをインストールします。

    [ 新しいプロジェクトの構成 ] ウィンドウが開きます。

プロジェクトの構成と作成

  1. [ プロジェクト名 ] テキスト ボックスで、プロジェクトに (具体的には WinRTAdapter) という名前を付けます。 メモ: 現時点では、この特定のプロジェクト名を使用する必要があります。

    [新しいプロジェクトの構成] ウィンドウで、プロジェクトに 'WinRTAdapter' という名前を付けます

    上のスクリーンショットのパスは、サンプル リポジトリを複製する方法を反映しています。

  2. [作成] ボタンをクリックします。

    [ 新しい Windows プロジェクト ] ダイアログが開きます。

    [New Windows Project] ダイアログ

  3. [ OK ] ボタンをクリックします。

    WinRTAdapter プロジェクトが作成され、ソリューション エクスプローラーでメイン プロジェクトの横に追加されます。

    新しく作成された WinRTAdapter プロジェクト

  4. [ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) は、この WinRTAdapter プロジェクトで実行されます。 次の手順では、このプロジェクトで選択したクラスのコードを生成します。

手順 3: WinRTAdapter プロジェクト用の Windows 実装ライブラリをインストールする

WinRTAdapter プロジェクトで、次のように Windows 実装ライブラリ (WIL) をインストールします。

  1. ソリューション エクスプローラーで、WinRTAdapter プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。 Visual Studio で [NuGet パッケージ マネージャー] ウィンドウが開きます。

  2. [NuGet パッケージ マネージャー] ウィンドウで、[参照] タブをクリックします。

  3. [NuGet パッケージ マネージャー] ウィンドウの [検索] ボックスに「Windows 実装ライブラリ」と入力し、[Windows 実装ライブラリ] カードを選択します。

    NuGet パッケージ マネージャー、「Windows 実装ライブラリ」パッケージの選択

  4. [ インストール] ボタンをクリックします。 [ 変更のプレビュー ] ダイアログが開きます。

    WinRTAdapter プロジェクトに対する WIL の変更のプレビュー ダイアログ

  5. [ OK ] ボタンをクリックします。

  6. [ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

これで、 WinRTAdapter プロジェクト用に WIL がインストールされました。 Windows 実装ライブラリ (WIL) は、Windows の COM コーディングを簡単に使用できるヘッダー専用の C++ ライブラリです。 Windows COM コーディング パターン用の読み取り可能で型安全な C++ インターフェイスを提供します。

手順 4: WinRTAdapter プロジェクト用の WebView2 プレリリース SDK をインストールする

WinRTAdapter プロジェクトでは、次のように WebView2 SDK のプレリリース版もインストールします。

  1. ソリューション エクスプローラーで、WinRTAdapter プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。 [NuGet パッケージ マネージャー] ウィンドウが開きます。

  2. [NuGet パッケージ マネージャー] ウィンドウで、[参照] タブをクリックします。

  3. [ プレリリースを含める ] チェック ボックスをオンにします。

  4. [ 検索 ] ボックスに「 WebView2」と入力します。

  5. Microsoft.Web.WebView2 カードをクリックします。 ウィンドウの中央に詳細情報が表示されます。

  6. [ バージョン] ドロップダウン リストで、WebView2 SDK の プレリリース バージョンを選択するか、[ 最新のプレリリース ] が選択されていることを確認します。 バージョンは 1.0.1243.0 以降である必要があります。 選択したバージョン番号をメモします。

    NuGet パッケージ マネージャー、WinRTAdapter プロジェクト用の WebView2 SDK パッケージの選択

  7. [ インストール] ボタンをクリックします。 [ 変更のプレビュー ] ダイアログが開きます。

    WebView2 SDK を WinRTAdapter プロジェクトに追加するための [変更のプレビュー] ダイアログ

  8. [ OK ] ボタンをクリックします。

  9. [ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

WebView2 プレリリース SDK が WinRTAdapter プロジェクト用にインストールされました。

手順 5: WebView2 プレリリース SDK をインストールする (WinUI 2 のみ)

MyUWPGetStartApp などのメイン プロジェクトでは、次のように、WinRTAdapter プロジェクト用にインストールしたのと同じプレリリース版の WebView2 SDK をインストールします。

  1. ソリューション エクスプローラーで、MyUWPGetStartApp などのメイン プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。 [NuGet パッケージ マネージャー] ウィンドウが開きます。

  2. [ プレリリースを含める ] チェック ボックスをオンにします。

  3. [ 参照 ] タブを選択します。

  4. [ 検索 ] ボックスに「 WebView2」と入力します。

  5. Microsoft.Web.WebView2 カードをクリックします。 ウィンドウの中央領域に詳細情報が表示されます。

  6. [ バージョン] ドロップダウン リストで、WebView2 SDK の プレリリース バージョンを選択するか、[ 最新のプレリリース ] が選択されていることを確認します。 WinRTAdapter プロジェクトで使用されているものと同じバージョンを使用してください。WinUI 2 (UWP) を対象とする WinRT WebView2 アプリの場合、WinRTAdapter プロジェクトと同じバージョンである必要があります。 バージョンは 1.0.1243.0 以降である必要があります。

  7. [ インストール] ボタンをクリックします。 [変更のプレビュー] ダイアログが開き、WebView2 がメイン プロジェクトに追加されます。

  8. [ OK ] ボタンをクリックします。

    Visual Studio は上記の手順セクションと似ていますが、現在、WinRTAdapter プロジェクトではなく、メイン プロジェクト用に NuGet パッケージ マネージャーが開かれている点が異なります。

  9. [ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

これで、メイン プロジェクト用に WebView2 プレリリース SDK がインストールされました。

手順 6: 選択したホスト API のソース コードを生成する

次に、使用する WinRT クラスを組み込むように wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) を構成します。 これにより、コンパイルされるソース ファイルが生成されます。 これらの API のコードを生成することで、Web 側の JavaScript コードでこれらの API を呼び出すことができます。

以下の手順の例では、2 つの Windows 名前空間を指定し、 wv2winrt ツールはこれらの名前空間下にある API のみのソース コードを生成します。

後で、サンプル アプリの実行中に、DevTools コンソールからこれらの API を呼び出して、これらの指定されたホスト側 API を Web 側コードから呼び出せることを示します。

名前空間とクラスを次のように指定します。

  1. ソリューション エクスプローラーで、WinRTAdapter プロジェクトを右クリックし、[プロパティ] を選択します。 [ WinRTAdapter プロパティ ページ ] ダイアログが開きます。

  2. 左側の [共通プロパティ]>WebView2 を展開して選択します。

  3. [ WebView2 WinRT API を使用する] を [いいえ] に設定します。 これにより、WebView2 SDK は WebView2 WinRT コンポーネントをプロジェクトの出力にコピーしません。 この WinRTAdapter プロジェクトは、WebView2 WinRT API を呼び出していないため、WinRT コンポーネントは必要ありません。

  4. [wv2winrt ツールを使用する] を[はい] に設定します。

  5. [ JavaScript のケースを使用する] を [はい] に設定します。

  6. [ フィルターを含める] 行で、右側の列をクリックし、そのセルのドロップダウン メニューをクリックして、[ 編集] をクリックします。 [ フィルターを含める ] ダイアログが開きます。

  7. 一番上のテキスト ボックスに、次の文字列を先頭または末尾の空白を入れずに別々の行に貼り付けます。

    Windows.System.UserProfile
    Windows.Globalization.Language
    

    フィルターを含めるダイアログ

    上記のように、名前空間またはクラスの完全な名前を指定する必要があります。

  8. [ OK ] ボタンをクリックして、[ フィルターを含める ] ダイアログを閉じます。

  9. このチュートリアルでは、[ WinRTAdapter プロパティ ページ] ダイアログが次のようになります。

    [WebView2 > 共通プロパティ] が展開された [WinRTAdapter プロパティ ページ] ダイアログ

  10. [ OK ] ボタンをクリックして、[ プロパティ ページ] ダイアログを閉じます。

  11. [ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

アダプター プロジェクトを指す参照を追加する

次に、アダプター プロジェクトをポイントする参照をメイン プロジェクトに追加します。

MyUWPGetStartApp などのメイン プロジェクトで、次のように WinRTAdapter プロジェクトを指す参照を追加します。

  1. ソリューション エクスプローラーで、MyUWPGetStartApp などのメイン プロジェクトを展開し、[参照設定] を右クリックして、[参照の追加] を選択します。 「 参照マネージャ」(Reference Manager ) ダイアログが開きます。

  2. 左側のツリーで、[ プロジェクト] を選択します。 [ WinRTAdapter ] チェック ボックスをオンにします。

    メイン プロジェクトの [参照マネージャー] ダイアログの [WinRTAdapter] チェック ボックス

  3. [ OK ] ボタンをクリックして、[ 参照マネージャ] ダイアログを閉じます。

  4. [ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

API コードを生成する

次に、API コードを生成します。

  1. WinRTAdapter プロジェクトを右クリックし、[ビルド] を選択します。

    wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) の [フィルターを含める] ダイアログで指定した名前空間またはクラスのソース コードが生成されます。

    • Windows.System.UserProfile 名前空間
    • Windows.Globalization.Language クラス
  2. ビルドが完了したら、[ ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

重要

WebView2 SDK のリリース バージョンをインストールし、 error MIDL2011: [msg]unresolved type declaration [context]: Microsoft.Web.WebView2.Core.ICoreWebView2DispatchAdapter [ RuntimeClass 'WinRTAdapter.DispatchAdapter' ]でビルドが失敗する場合、これはWebView2 SDK のリリース バージョンの問題であり、上記の手順で [WebView2 WinRT API を使用する ] を [はい ] に変更する必要があります。

または、プロジェクト ファイル WinRTAdapter.vcxprojの最後の</ItemGroup>の後に以下を追加します。

<ItemGroup Condition="'$(WebView2UseDispatchAdapter)' == 'true'">
 <Reference Include="$(WebView2SDKPath)lib\Microsoft.Web.WebView2.Core.winmd">
   <!-- wv2winrt needs Dispatch Adapter metadata to generate code -->
 </Reference>
</ItemGroup>

$(WebView2SDKPath) を WebView2 SDK がインストールされたディレクトリに置き換え、末尾に\を付けます。 例: ..\<sample-directory>\packages\Microsoft.Web.WebView2.1.0.1264.42\。

手順 7: ターゲット フレームワークを更新する (WinUI 3 のみ)

アプリが WinUI 2 (UWP) 用の場合は、この手順をスキップします。

手順 8: メイン プロジェクトにホスト オブジェクトを追加する

次に、WinRT オブジェクトをホスト アプリのネイティブ側からホスト アプリの Web 側に渡します。 これを行うには、次のように AddHostObjectToScript を呼び出す InitializeWebView2Async メソッドを追加します。

  1. ソリューション エクスプローラー で、メイン プロジェクト (MyUWPGetStartApp など) を展開し、MainPage.xaml を展開して、[MainPage.xaml.cs] を選択します。

  2. MainPage コンストラクターの下に、次の InitializeWebView2Async メソッドを追加します。

    private async void InitializeWebView2Async()
    {
       await WebView2.EnsureCoreWebView2Async();
       var dispatchAdapter = new WinRTAdapter.DispatchAdapter();
       WebView2.CoreWebView2.AddHostObjectToScript("Windows", dispatchAdapter.WrapNamedObject("Windows", dispatchAdapter));
    }
    

    このメソッドは AddHostObjectToScript を呼び出します。

    AddHostObjectToScript("Windows", ...行では、Windows は最上位の名前空間です。 他の最上位の名前空間がある場合は、次の例のように、 AddHostObjectToScriptに呼び出しを追加できます。

    WebView2.CoreWebView2.AddHostObjectToScript("RuntimeComponent1", dispatchAdapter.WrapNamedObject("RuntimeComponent1", dispatchAdapter));
    

    WrapNamedObject 呼び出しは、RuntimeComponent1 名前空間のラッパー オブジェクトを作成します。 AddHostObjectToScript 呼び出しでは、RuntimeComponent1 という名前を使用して、ラップされたオブジェクトをスクリプトに追加します。

    カスタム WinRT コンポーネントの使用方法に関する完全なガイダンスについては、以下の 「カスタム (サードパーティ) WinRT コンポーネント」をご覧ください。

  3. MainPage コンストラクター (this.InitializeComponent();) に、次のコードを追加します。

    InitializeWebView2Async();
    
  4. MyUWPGetStartApp などのメイン プロジェクトを右クリックし、[スタートアップ プロジェクトとして設定] を選択します。 太字はスタートアップ プロジェクトを示します。

  5. [ファイル>すべて保存] (Ctrl+Shift+S) を選択します。

  6. F5 キーを押してサンプル アプリを実行します。 WebView2 対応 WinUI 2 (UWP) アプリが開きます。

    WebView2 WinUI 2 UWP アプリ

ホスト アプリの Web 側コード (および DevTools コンソール) は、ホスト オブジェクトの指定された名前空間またはクラスのメソッドとプロパティを呼び出すことができます。

手順 9: Web 側の JavaScript からホスト オブジェクトのメソッドとプロパティを呼び出す

DevTools コンソールを使用して、投影された API にアクセスする

次に、DevTools コンソールを使用して、 wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) で指定されたホスト側 API を Web 側コードが呼び出すことができることを示します。

  1. アプリが実行されていない場合は、Visual Studio で F5 キーを押してサンプル アプリを実行します。

  2. WebView2 サンプル アプリ ウィンドウのメイン部分をクリックしてフォーカスを表示し、 Ctrl+Shift+I を押して Microsoft Edge DevTools を開きます。 または、ページを右クリックし、[ 検査] を選択します。

    Microsoft Edge DevTools ウィンドウが開きます。

  3. Microsoft Edge DevTools ウィンドウが表示されない場合は、 Alt+Tab キーを押して表示します。

  4. [DevTools] ウィンドウで、[コンソール] タブを選択します。

  5. [ コンソールのクリア ] (コンソールのクリア アイコン) ボタンをクリックするか、 コンソール を右クリックして [ コンソールのクリア] を選択します。 メッセージがコンソールに定期的に表示される場合があります。

  6. DevTools コンソールに、次の Windows.Globalization.Language クラス コードを貼り付け、 Enter キーを押します。

    const Windows = chrome.webview.hostObjects.sync.Windows;
    (new Windows.Globalization.Language("en-US")).displayName;
    

    コンソールは、 English (米国)などの言語名文字列を出力します。これは、アプリのホスト側 (ネイティブ側) コードを Web 側の JavaScript コードから呼び出すことを示しています。

    DevTools コンソールを使用して、Web 側コードからネイティブ側コードの呼び出しをテストする

  7. かっこを省略してみてください。 DevTools コンソールで、次のステートメントを入力します。

    new Windows.Globalization.Language("en-US").displayName;
    

    コンソールは、 English (米国) などの言語名文字列を出力します。

    同様に、Windows.System.UserProfile 名前空間のメンバーにもアクセスできます。

  8. DevTools ウィンドウを閉じます。

  9. アプリを閉じます。

おめでとうございます! これで、JavaScript コードから WinRT コードを呼び出すサンプル デモが完了しました。

ソース コード ファイルを介して投影された API にアクセスする

上記では、DevTools コンソールを使用して、投影されたホスト オブジェクトにアクセスする JavaScript ステートメントを実行しました。 同様に、ソース コード ファイル内から投影されたホスト オブジェクトにアクセスできます。 これを行うには、まずスクリプトのセットアップ コードを実行します。

// early in setup code:
const Windows = chrome.webview.hostObjects.sync.Windows;

次に、コードの本文で、次のように投影オブジェクトへの呼び出しを追加します。

(new Windows.Globalization.Language("en-US")).displayName;

同様に、 Windows.System.UserProfile API メンバーにアクセスできます。

これで、チュートリアルの手順は終了です。 以下のセクションは、WebView2 WinRT アプリに関する一般的な情報です。

カスタム (サードパーティ) WinRT コンポーネント

wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) は、ファースト パーティの OS WinRT API に加えて、カスタム サード パーティの WinRT コンポーネントをサポートします。

wv2winrt ツールを使用したサードパーティの WinRT コンポーネント

wv2winRT ツールでカスタム (サードパーティの) WinRT コンポーネントを使用するには、上記の手順に加えて、次の手順も実行します。

  1. WinRT クラスを実装する Visual Studio ソリューションに (メイン アプリと WinRTAdapter プロジェクト以外) 3 つ目のプロジェクトを追加します。

  2. WinRTAdapter プロジェクトで、WinRT クラスを含む新しい 3 番目のプロジェクトに「参照を追加」します。

  3. プロパティの WinRTAdapter プロジェクトの Include フィルターを更新して、新しいクラスも含めます。

  4. InitializeWebView2Asyncに追加行を追加して、winrt クラスの名前空間を追加します。

    WebView2.CoreWebView2.AddHostObjectToScript("MyCustomNamespace", dispatchAdapter.WrapNamedObject("MyCustomNamespace", dispatchAdapter));

  5. Web から簡単にメソッドを呼び出すには、必要に応じて、名前空間同期プロキシをスクリプトのグローバル オブジェクトとして追加します。 例:

    window.MyCustomNamespace = chrome.webview.hostObjects.sync.MyCustomNamespace;

この例については、次の WebView2 サンプルを参照してください:

非同期 WinRT メソッド

上記のガイドの手順に従って、同期プロキシを使用できるはずです。 非同期メソッド呼び出しの場合は、 chrome.webview.hostObjects.options.forceAsyncMethodMatches を使用する必要があります。

forceAsyncMethodMatches プロパティは正規表現の配列です。正規表現が同期プロキシ上のメソッド名と一致する場合は、代わりに非同期で実行されます。 これを [/Async$/] に設定すると、サフィックス Async で終わるすべてのメソッドと一致します。 その後、一致するメソッド呼び出しは非同期プロキシのメソッドと同じように機能し、待機できる promise を返します。

例:

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/'));

詳細については、「CoreWebView2.AddHostObjectToScript メソッド」のforceAsyncMethodMatches行を参照してください。

WinRT イベントのサブスクライブ

WinRT イベントは、スクリプト プロキシを介しても公開されます。 addEventListener(string eventName, function handler) メソッドと removeEventListener(string eventName, function handler) メソッドを使用して、インスタンスの WinRT イベントと静的 WinRT イベントのイベント ハンドラーを追加および削除できます。

これらのメソッドは、同じ名前の DOM メソッドと同様に機能します。 最初のパラメーターとしてサブスクライブする WinRT イベントの文字列名と、イベントが発生するたびに呼び出される関数コールバックを使用して addEventListener を呼び出します。 同じパラメーターを使用して removeEventListener を呼び出すと、そのイベントからサブスクライブ解除されます。 例:

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);
});

イベント引数を提供する WinRT イベントの場合、これらはイベント ハンドラー関数の最初のパラメーターとして提供されます。 たとえば、 Windows.Foundation.Collections.PropertySet.MapChanged イベント IMapChangedEventArgs<string, object> イベント引数オブジェクトがあり、そのオブジェクトがコールバックのパラメーターとして指定されます。

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;
    // ...
});

イベントの args オブジェクトには、さらに次のプロパティがあります。

プロパティ名 説明
target イベントを発生させたオブジェクト
type イベントの文字列名
detail WinRT デリゲートに提供されるすべてのパラメーターの配列

AddHostObjectToScript にする JavaScript プロキシは他の JavaScript API と同じように動作します

AddHostObjectToScript 既定では非同期プロキシと詳細プロキシが使用されますが、 AddHostObjectToScript JavaScript プロキシを他の JavaScript API のように動作させることができます。 AddHostObjectToScript とその既定の動作の詳細については、「AddHostObjectToScript」を参照してください。 また、JavaScript UWP アプリの JavaScript WinRT プロジェクションからホスト アプリを移行する場合、または EdgeHTML ベースの WebView からホスト アプリを移行する場合は、以前の動作に合わせるために次の方法を使用できます。

AddHostObjectToScript JavaScript プロキシを他の JavaScript API のように動作させるには、次のプロパティを設定します。

  • chrome.webview.hostObjects.option.defaultSyncProxy - プロキシは非同期または同期のいずれかです。 通常、同期プロキシでメソッドを呼び出すとき、結果も同期プロキシである必要があることがわかっています。 ただし、ネイティブ コードへの関数への参照を提供し、ネイティブ コードが後でその関数を呼び出す場合など、そのコンテキストが失われる場合があります。 このような場合、このプロパティが設定されていない限り、プロキシは非同期プロキシになります。

  • chrome.webview.hostObjects.options.forceAsyncMethodMatches - これは正規表現の配列です。 同期プロキシでメソッドを呼び出す場合、メソッド名がこの配列内の文字列または正規表現と一致する場合、メソッドの呼び出しは実際には非同期で実行されます。 この値を [/Async$/] に設定すると、 Async で終わるすべてのメソッドが非同期メソッド呼び出しになります。 非同期メソッドがここで一致せず、非同期に強制されていない場合、メソッドは同期的に呼び出され、呼び出し元の JavaScript の実行をブロックしてから、promise を返すのではなく、Promise の解決を返します。

  • chrome.webview.hostObjects.options.ignoreMemberNotFoundError - プロキシのプロパティの値を取得しようとして、そのプロパティが対応するネイティブ クラスに存在しない場合は、このプロパティを true に設定しない限り、例外が発生します。この場合、動作は Chakra WinRT 投影動作 (および一般的な JavaScript 動作) と一致し、エラーなしで undefined を返します。

Chakra WinRT プロジェクションでは、WinRT 名前空間をルート オブジェクトに直接配置します。 対照的に、

  • AddHostObjectToScript 非同期ルート プロキシを chrome.webview.hostObjects に配置します。
  • AddHostObjectToScript 同期ルート プロキシを chrome.webview.hostObjects.sync 上に配置します。

Chakra WinRT プロジェクション コードで想定されるルート プロキシにアクセスするには、ルート プロキシの WinRT 名前空間の場所をルート オブジェクトに割り当てることができます。 例:

window.Windows = chrome.webview.hostObjects.sync.Windows;

上記のすべての設定を行う JavaScript が最初に実行されるようにするには、上記のステートメントを JavaScript に追加するか、 CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync メソッドを使用して、他のスクリプトを実行する前に上記のステートメントを自動的に挿入するように WebView2 に指示できます。

次の例は、上記の手法を示しています。

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;" +
                    "}" +
                "})();");

WebView2 のプロパティに関する情報を取得する

WebView2 のプロパティに関する情報は、次の 2 つの場所で入手できます。

  • WinRTAdapter プロジェクトのプロパティ ページ。
  • wv2winrt.exe コマンド ライン ヘルプ。 これが wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) です。

WinRTAdapter プロジェクトのプロパティ ページ

WinRTAdapter プロジェクトのプロパティ ページで、プロパティに関するヘルプを表示するには、プロパティ行をクリックします。 ダイアログ ボックスの下部にヘルプが表示されます。

WinRTAdapter プロパティ ページに一覧表示されているプロパティ

wv2winrt.exe プロパティのコマンド ライン ヘルプ

wv2winrt.exe のコマンド ライン ヘルプでは、wv2winrt ツール (WebView2 WinRT JS プロジェクション ツール) のパラメーターについて説明します。 例:

パラメーター 説明
verbose 作成されたファイル、包含ルールと除外ルールに関する情報など、標準化するコンテンツをいくつかリストします。
include 上記のリストでは、リストされているものを除き、デフォルトで名前空間とランタイムクラスは除外されます。 インクルード宣言は、その名前空間内のすべてを含む名前空間、またはそのランタイムクラスだけを含むランタイムクラス名のいずれかです。
use-javascript-case 生成されたコードを変更して、Chakra JavaScript WinRT プロジェクションと同じ大文字と小文字のスタイルを使用するメソッド名、プロパティ名などを生成します。 既定では、winrt に一致する名前が生成されます。
output-path 生成されたファイルが書き込まれるパスを設定します。
output-namespace 生成された WinRT クラスに使用する名前空間を設定します。
winmd-paths コード生成のために検査する必要があるすべての winmd ファイルのスペース区切りのリスト。

関連項目

チュートリアルとサンプル:

API リファレンス:

.NET に相当する記事: