WebView2 Runtimeが見つからないエラー 解決法一例(凡ミスだった)

TL;DR

プロジェクトのTarget Frameworkの .Netのバージョンを変えると、出力のフォルダー名も変わるため、Windows Securityでのコントロールされたフォルダーへのアクセス制限除外設定が無効になる。 "XXファイルが見つからない"のようなエラーが出たときはまずWindows Securityにブロックされているかをチェックすべき。
ブロックされているとしても、時々Windowsの通知が遅れたりするので、気づかないときもある。

エラー発生時の状況

先日Visual Studio 2022 RCを入れるまえに、VS2019をアンインストールしました。
そのときに .Net Core 3.1も一緒に削除されました。
久しぶりにある自作のアプリを使おうとしたら、".Net Core 3.1がないよ"と怒られ、起動できませんでした。
自分用のアプリは一部 .Net Framework依存のもの以外、ほとんど .Net 5への移行が完了していますが、このアプリはし忘れていました。
さて、これを機にアップグレードしようかと思い、プロジェクトを開き、"Target Framework"を .Net 5に設定しました。
このアプリはWPFアプリで、WebView2の古いバージョン1つしかコントロールがありません。機能もシンプルなので、何も修正せずに移行できるとなんとなく自信がありました。
ついでにNuget ManagerでWebView2も最新のものにアップデートして、待ちきれずにF5を押してDebugを実行したら、まさかのエラーが出ました~~ 

WebView2 Runtimeエラー


エラーの詳細

Microsoft.Web.WebView2.Core.WebView2RuntimeNotFoundException HResult=0x80131500 Message=Couldn't find a compatible Webview2 Runtime installation to host WebViews.

compatible、互換性のあるWebView2 Runtimeが見つからなかったと、WebView2のRuntimeはEvergreen方式で常に最新のものに保てて、このプロジェクトで使っているコントロールもNugetで最新にしたばかりなのにね、どうして互換性がないの?と戸惑いました。
エラーメッセージがあるし早速検索してみました。
GithubのWebView2のフィードバックスレに同じエラーの人がいて、同じくWPFタイプのアプリでしたので、きっとこれと同じだろうと思いこみ、Runtimeのチェックやコントロール初期化の順番等いろいろいじりました。
でも治りません。なんでだろうと悩んでる最中に、画面の右下に通知がずっとたまっていたように相次いでポップアップしてきました。

保護されたフォルダーへのアクセスがブロックされました。

よく見たら、ブロックされたのはまさに今いじっているアプリじゃないですか!
通知はいちいちくるものうざいけど、溜まってこないものどうかなと思いました。
時間を返してよ;;

Windows Securityにブロックされた原因

今まで大丈夫だったのに、なんでいきなりブロックされるようになったのか、よく考えたらそれはそうだなと納得しました。 まずこのプロジェクトはOneDriveの中に置かれていて、OneDriveはWindows Securityの「保護されたフォルダー」に設定されています。
このアプリのexeファイルは例外として、保護されたフォルダーへのアクセスを許可しましたが、 .Net 5にアップグレードしたことで、出力フォルダーが変わったため、Windows Securityに別アプリとして認識されました。
.NetはたぶんCoreのときから、出力フォルダーの名前をバージョン依存にしましたので、net3.1-windowsnet5.0-windowsになるようにフォルダー名が変わります。
Windowsセキュリティーを開いて、ウイルスと脅威の防止ランサムウェアの防止アプリをコントロールされたフォルダーアクセスで許可するで最新のアプリを追加すれば無事起動できました。

反省

思いこみが禁物!
compatible ということばを見て、互換性の問題と思いこみ、コードを含めていろいろいじってしまいました。もっとシンプルに考えるべきでした。
ただの凡ミスですが、ここにメモしておいて、今後の参考にしたいと思います。

コメント

このブログの人気の投稿

C# WebView2.ExecuteScriptAsync()のいくつかの使い方とDebug方法

C# 外部ライブラリを使わずに半角→全角カタカナ変換

C# WebView2を通じてWebサーバーなしでJavaScriptからローカルファイルを読み書き