WebView2 EnsureCoreWebView2Async の初期化で例外が出る対応法 [プログラム]
C# で WebView2 を使う場合デフォルトではテンポラリディレクトリを実行ファイル直下に置こうとします。
しかし、インストーラでインストールした場合パーミッションがなく初期化に失敗して動作しません。
そこで、
CoreWebView2Environment
EnsureCoreWebView2Async
を使ってテンポラリディレクトリをパーミッションのあるドキュメントフォルダなどに移動させています。
上記のようなコードで初期化しています。
webView1 は webView2 のコントールで Source に何も指定しないでおくと初期化を遅らすことができるようです(指定してしまうと実行ファイルのディレクトリで環境が即作成されてしまいました)。
上記のようなコードでテンポラリディレクトリを移動しています(この方法は WEB で見つけました)。
そして、このときに Edge のプロセスが作成されるようです。
この環境は一度実行して webView2 のコントロールを消さずに2個めのコントロールを同じように初期化すると同じ環境が使い回されます。
つまりは2つ目以降は同一 Edge のタブのような扱いになるようで、プロセスの起動がない分高速化されるようです。
また、これをしないと webView2 コントロールを出すたびに初期化が繰り返されたまに初期化が固まることがありました。
これを発見して安定化、高速化していたのですが、2つ目の webView2 のコントロールを初期化する前に、
上記のキー入力のコードが実行されると2つ目の初期化に失敗することを発見しました。
一見何も関係がなさそうですが例外が必ず発生します。
そこで、
上記のように EnsureCoreWebView2Async の前にキー入力のコードを入れると回避できることを発見しました。
回避策を見つけるまでものすごく手こずったので記録として残しておきます。
バグであれば修正されることを期待したいです。
なにか情報お持ちの方があれば教えていただければ幸いです。
しかし、インストーラでインストールした場合パーミッションがなく初期化に失敗して動作しません。
そこで、
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 の前にキー入力のコードを入れると回避できることを発見しました。
回避策を見つけるまでものすごく手こずったので記録として残しておきます。
バグであれば修正されることを期待したいです。
なにか情報お持ちの方があれば教えていただければ幸いです。
VisualStudio2019 Microsoft Visual Studio Installer Projects インストール不能対策 [プログラム]
VisualStudio2019 で Visual Studio Installer Projects のインストールに失敗してインストーラーを作成不能になりました。
以下解決したので忘備録として記載します。
現象としては VisualStudio 2019 を立ち上げるとよく覚えてないですが Installer Project か何かのアップデート通知が来ていました。
それでアップデートを行ったところ、
インストールに失敗しましたとダイアログが出ました。
良くわからず再起動すると普通に立ち上がりコンパイルできましたが、インストーラプロジェクトが<非互換>のマークがついて作成不能になっていました。
それで、色々調べましたが、
というログが残っていて、
https://developercommunity.visualstudio.com/content/problem/575359/microsoft-visual-studio-installer-projects-v093-fa.html
ここにたどり着きました。
どうも、この"Microsoft.VisualStudio.DeployWizard.dll"を消去したらいいらしいです。
消すのは怖いので_bkと後ろにつけてリネームし、VisualStudio2019 を立ち上げて 拡張機能->拡張機能の管理 から Microsoft Visual Studio Installer Projects をインストールしなおしたところ問題なくインストールできました。
<非互換>になっているプロジェクトはプロジェクトを右クリック -> 再読み込み すれば正常になりました。
以下解決したので忘備録として記載します。
現象としては VisualStudio 2019 を立ち上げるとよく覚えてないですが Installer Project か何かのアップデート通知が来ていました。
それでアップデートを行ったところ、
インストールに失敗しましたとダイアログが出ました。
良くわからず再起動すると普通に立ち上がりコンパイルできましたが、インストーラプロジェクトが<非互換>のマークがついて作成不能になっていました。
それで、色々調べましたが、
failed to install. System.IO.IOException: The file 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\PublicAssemblies*Microsoft.VisualStudio.DeployWizard.dll’ already exists.*
というログが残っていて、
https://developercommunity.visualstudio.com/content/problem/575359/microsoft-visual-studio-installer-projects-v093-fa.html
ここにたどり着きました。
どうも、この"Microsoft.VisualStudio.DeployWizard.dll"を消去したらいいらしいです。
消すのは怖いので_bkと後ろにつけてリネームし、VisualStudio2019 を立ち上げて 拡張機能->拡張機能の管理 から Microsoft Visual Studio Installer Projects をインストールしなおしたところ問題なくインストールできました。
<非互換>になっているプロジェクトはプロジェクトを右クリック -> 再読み込み すれば正常になりました。