SSブログ

WebView2 EnsureCoreWebView2Async の初期化で例外が出る対応法 [プログラム]

C# で WebView2 を使う場合デフォルトではテンポラリディレクトリを実行ファイル直下に置こうとします。
しかし、インストーラでインストールした場合パーミッションがなく初期化に失敗して動作しません。
そこで、
CoreWebView2Environment
EnsureCoreWebView2Async
を使ってテンポラリディレクトリをパーミッションのあるドキュメントフォルダなどに移動させています。

private async void InitializeWebView2Async(string tempDir)
{
 // 初期化完了イベントフック
 webView1.CoreWebView2InitializationCompleted += webView2CoreWebView2InitializationCompleted;
 // webView2 の環境作成
 CoreWebView2Environment webView2Environment = await 
  CoreWebView2Environment.CreateAsync(null,tempDir,null);
 // webView2 コントルールを初期化する
 webView1.EnsureCoreWebView2Async(webView2Environment);
}


上記のようなコードで初期化しています。
webView1 は webView2 のコントールで Source に何も指定しないでおくと初期化を遅らすことができるようです(指定してしまうと実行ファイルのディレクトリで環境が即作成されてしまいました)。
上記のようなコードでテンポラリディレクトリを移動しています(この方法は WEB で見つけました)。
そして、このときに Edge のプロセスが作成されるようです。

この環境は一度実行して webView2 のコントロールを消さずに2個めのコントロールを同じように初期化すると同じ環境が使い回されます。
つまりは2つ目以降は同一 Edge のタブのような扱いになるようで、プロセスの起動がない分高速化されるようです。
また、これをしないと webView2 コントロールを出すたびに初期化が繰り返されたまに初期化が固まることがありました。

これを発見して安定化、高速化していたのですが、2つ目の webView2 のコントロールを初期化する前に、

Keyboard.IsKeyDown(Key.Return);

上記のキー入力のコードが実行されると2つ目の初期化に失敗することを発見しました。

一見何も関係がなさそうですが例外が必ず発生します。
そこで、

private async void InitializeWebView2Async(string tempDir)
{
 // 初期化完了イベントフック
 webView1.CoreWebView2InitializationCompleted += webView2CoreWebView2InitializationCompleted;
 // webView2 の環境作成
 CoreWebView2Environment webView2Environment = await 
  CoreWebView2Environment.CreateAsync(null,tempDir,null);
 // webView2 初期化時に落ちないようにするマジックコード
 Keyboard.IsKeyDown(Key.Return);
 // webView2 コントルールを初期化する
 webView1.EnsureCoreWebView2Async(webView2Environment);
}

上記のように EnsureCoreWebView2Async の前にキー入力のコードを入れると回避できることを発見しました。

回避策を見つけるまでものすごく手こずったので記録として残しておきます。
バグであれば修正されることを期待したいです。
なにか情報お持ちの方があれば教えていただければ幸いです。

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。