目次
背景
Adobe Readerのサポートが2020年7月7日に終了。
またWindows10のIEサポートが2022年6月15日で終了。
これによってAdobe Readerをいち早くアンインストールすることになったのだが、今までの.NETのWeb BrowserコントロールでPDFを閲覧していたのが閲覧できなくなった。
そのため、代替案としてWeb Browserコントロール自体を差し替えて、WebView2コントロールを使用することにした。
開発環境の構築
WebView2の開発にはNuGetからのWebView2パッケージのインストールが必要。
WebView2で検索すると一番上に出てくるので探すのは簡単。
問題はインストールするバージョン。
業務で使用するので、会社では安定版をインストールした。
しかし安定版をインストールすると、デザイナのツール欄に出てこなかった。
仕方ないのでプレリリース版をインストールすることに。
こちらをインストールするとデザイナで配置可能となった。
プレリリース版は、NuGetの検索画面でプレリリース版も含むにチェックを入れて検索するだけ。
これにより検索結果のインストール画面にプレリリースバージョンが表示される。
あとはこれを選択してインストールまたは更新を行う。
また、最後に安定版に戻したければNuGet画面でバージョンを安定版に変えて更新すればいい。
更新後のビルドでエラーが出る場合もあるが、VisualStudioの再起動で直る。
実行環境の配布方法
WebView2コントロールをソフトで使用するには、使用するPCにWebView2用のランタイムまたは開発バージョン版のEdgeのインストールが必要となる。
Edgeのインストールは、配布する形だと厳しいのでランタイムが現実的な選択肢。
こちらだとサイレントインストールも可能なのでより適している。
サイレントインストール例 : 「MicrosoftEdgeWebView2RuntimeInstallerX64.exe" /silent /install」
また実際に使用する場合、以下のDLLが実行するソフトと同じフォルダ直下に必要。
- 「Microsoft.Web.WebView2.Core.dll」
- 「Microsoft.Web.WebView2.WinForms.dll」
- 「Microsoft.Web.WebView2.Wpf.dll」
- 「runtimes\win-x86\native\WebView2Loader.dll」
これらのファイルは、いずれもNuGetでWebView2パッケージをインストールしたソリューションのフォルダの「packages」フォルダの下に配置されている。
もしくはビルドすると、ビルドフォルダに自動的にコピーされているのでそちらから取得する。
配布した先で使用する場合、開発ソフトと同時にこれらのファイルも配布が必要。
ランタイムは、再頒布可能なランタイムなのでライセンスは気にする必要はない。
WebView2の使用方法
初期化
初期化の際にユーザーデータフォルダを指定したほうがいい。
指定しないと、WebView2を使用するソフト毎にブラウザキャッシュフォルダが生成され、データが肥大化するだけで無く、各ソフト毎に設定が違ってしまう。
自分が厄介だと思ったのが、PDFやブラウザを既定にする上部ウィンドウが各ソフトで出てしまうこと。
最初の1回だけなら許容だったのだが、ユーザーデータを共通にしてないと、各ソフト毎で毎回設定をしなければならない。
これを回避するために以下のように非同期メソッドを作って、初期化時に呼び出す。
Private Async Sub InitializeAsync()
Dim objCoreEnviroment As Microsoft.Web.WebView2.Core.CoreWebView2Environment = Await Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(Nothing, "C:\Temp\WebView2")
Await wvMain.EnsureCoreWebView2Async(objCoreEnviroment)
End Sub
これで同じフォルダを指定したソフトは、設定が共通となる。
ブラウザ表示
WebView2のブラウザ表示は、下記のように記述する。
wvMain.Source = New Uri("{URL文字列またはファイルパス}")
この際に注意が必要なのは、ネットワーク越しに置かれているHTML,PDFファイルを指定すると、セキュリティによって閲覧できないこと。
WNetAddConnection2などでネットワーク認証する必要がある。
ただこれでも繋げない場合があって、自分はC++側のソフトで認証していた(WNetAddConnection2ではなく、メモリマップドファイル形式)のだが、その状態だと改めてWNetAddConnection2しても、しなくても繋げなかった。
最終的にファイルコピーなどはできたので、一旦ローカルにファイルをコピーしてから表示することで回避した。