PowershellでWebBrowser(CefSharp)を動かす

#概要
特に需要はないかもしれないけどPowershellでブラウザ表示させて操作する必要があるかもしれない。
けれど標準のWebブラウザーコントロールだとIEで動作してしまうので、サポートとか表示の問題とかいらない心配をしたくないのでIEを使わないようにしようぜという話。
調べてみるとそんなに情報がなかったので備忘録として残しておきます。

#目次
・準備
・WinFormsで動かす
・WPFで動かす

#準備
VisualStudioのNugetでダウンロードし、そこから必要なコンポーネントを抜き出します。
適当なWPFアプリケーションを作成（WinFormsで動かしたい場合はWindowsフォームアプリケーションを作成）して[ツール]→[NuGet パッケージマネージャー]→[ソリューションのNuGetパッケージの管理]を開きます。

下記のパッケージをインストールします。
（依存関係で自動的にダウンロードされるものもあります）
・CefSharp.Common
・CefSharp.WinForms（WindFormsで動かす場合）
・CefSharp.Wpf（WPFで動かす場合）
・cef.redist（動かしたいビット数の方をインストールする）

↓の記事を見るとcef.redistのモジュールがいるとの事。
https://stackoverflow.com/questions/58006674/running-cefsharp-in-powershell

cef.redistのモジュールのダウンロード先の下記フォルダをコピーします。(64bit版の場合)
C:\Users\\<ユーザー名>\\.nuget\packages\cef.redist.x64\\<バージョン番号>\\CEF

コピーしてきたフォルダに以下のファイル(モジュール)を入れていきます。
C:\Users\\<ユーザー名>\\.nuget\packages\cefsharp.common\\<バージョン番号>\\runtimes\win-x64\lib\netcoreapp3.0
・CefSharp.Core.dll
・CefSharp.Core.Runtime.dll
・CefSharp.dll
C:\Users\\<ユーザー名>\\.nuget\packages\cefsharp.common\\<バージョン番号>\\CefSharp\x64
・CefSharp.BrowserSubprocess.Core.dll
・CefSharp.BrowserSubprocess.exe

C:\Users\\<ユーザー名>\\.nuget\packages\cefsharp.wpf\\<バージョン番号>\\lib\net452
・CefSharp.Wpf.dll

C:\Users\\<ユーザー名>\\.nuget\packages\cefsharp.winforms\\<バージョン番号>\lib\net452
・CefSharp.WinForms.dll

ファイルをかき集めるとこんな感じになります。
![file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607146/a409011f-b84e-a74e-6eb1-99db95c76da3.png)

これで動かす準備が整いました。

#WinFormsで動かす
[準備]の項目で作ったフォルダ内にps1ファイルを作成して動作を確認してみます。
コード参考：https://stackoverflow.com/questions/58006674/running-cefsharp-in-powershell
（ここに記載のコードだけだと動作しなかったのでモジュール追記して動作するようにしています）

```Powershell
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.Core.dll")
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.Core.Runtime.dll")
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.WinForms.dll")
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.dll")

Add-Type -AssemblyName System.Windows.Forms

# WinForm Setup
$mainForm = New-Object System.Windows.Forms.Form
$mainForm.Font = "Comic Sans MS,9"
$mainForm.ForeColor = [System.Drawing.Color]::White
$mainForm.BackColor = [System.Drawing.Color]::DarkSlateBlue
$mainForm.Text = "CefSharp"
$mainForm.Width = 960
$mainForm.Height = 700

[CefSharp.WinForms.ChromiumWebBrowser] $browser = New-Object CefSharp.WinForms.ChromiumWebBrowser "www.google.com"
$mainForm.Controls.Add($browser)

[void] $mainForm.ShowDialog()

```

#WPFで動かす
同じように[準備]の項目で作ったフォルダ内にps1ファイルを作成して動作を確認してみます。

```Powershell
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.Core.dll")
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.Core.Runtime.dll")
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.Wpf.dll")
[System.Reflection.Assembly]::LoadFile("$PSScriptRoot\CefSharp.dll")

Set-PSDebug -Strict
Add-Type -AssemblyName PresentationFramework

[xml]$xaml = @'
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WebBrowserTest"
        xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
        Title="test" Height="720" Width="1280">
    <Grid>
        <cef:ChromiumWebBrowser Address="https://www.google.co.jp" />
    </Grid>
</Window>
'@

$reader = New-Object System.Xml.XmlNodeReader $xaml
$frame = [System.Windows.Markup.XamlReader]::Load($reader)

$frame.ShowDialog()
```