.NetCore対応しました!プレビューくらいの位置づけです。
github.com
コードはこんな感じ。今までと違うのはWindowsAppFriendのコンストラクタの引数にcoreclr.dllのパスを渡しているとこだけです。今はプレビューなのでパスを渡してますけど、もう少ししたらこれは別の方法も提供するかも。(まだ最適な方法がわかってないんですよね)
[TestCase] publicvoid TestCore() { //普通にプロセス取得 var targetApp = Process.GetProcessesByName("TestTargetCore")[0]; //※ここだけ違う//WindowsAppFriendのコンストラクタにcoreclr.dllのパスを渡す var dllPath = @"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.0.0-preview7-27912-14\coreclr.dll"; var app = new WindowsAppFriend(targetApp, dllPath); //後は今まで通り操作可能 var w = app.Type<Application>().Current.MainWindow; w.Title = "タイトル変更"; //RM.Friendly.WPFStandardControlsとかも利用可能 var textBox = new WPFTextBox(w._textBox); textBox.EmulateChangeText("abc"); }
以前にプロトでFriendly.DotNetCoreを作りましたが、最終的には全然違うアプローチにしました。Friendly.Windowsをちょっとだけ修正して対応するというものです。
.NetFrameworkで使ってたコードがそのまま使えます。
正確にはWindowsAppFriendのコンストラクタは変更しないとダメですけど、ほぼそのまま使えます。つまり.NetFrameworkのアプリがあって、それに対応するテストを作っておけば、そのアプリを.NetCoreに変更したら、その後の回帰検査にそのテストを使うことができます。
.NetCore対応は何をしたか(何をしなければならないと思っていたか)
Friendlyの初期化処理です。こんな感じになってます。
以下二つの理由でFriendly.Windowsでは動かないと思っていました。
- ホストAPIでは.NetCoreのランタイムにはアクセスできない
- .NetCoreから.NetFrameworkのdllは参照できない
なんで、.NetCore対応は超面倒って思ってました。でもよく調べてると、両方とも誤解だということがわかりました。
ホストAPI
結論から言うと.NetCoreのランタイムを操作するホストAPIがありました。
docs.microsoft.com
ICLRRuntimeHostってのを使ってたんですけど、.NetCoreに対応したICLRRuntimeHost4ができてたようです。
.NetCoreから.NetFrameworkのdllは参照できる
これも結論から言うとできるんですよ。びっくりしてちょっと前にもブログ書きました。
ishikawa-tatsuya.hatenablog.com
.NetStandardか.NetCoreじゃないと参照できないって思ってましたけど。じゃあ別にexeだけ.NetCore対応したらそれでよくね?
一応ポータビリティをチェックしましたが、Friendly系のライブラリは.NetCoreへのポータビリティは100%でした。
marketplace.visualstudio.com
最終的にやったこと
.NetCore用のホストAPIを使うネイティブのdllを新しく作って、.NetCoreの場合はそれを呼びだすようにしました。操作方法は数種類あって、調査時間かかりそうだなーって思ってましたが、@tmytと@nak763が手伝ってくれたんで、サクッと終わりました。ありがとうございました!
https://github.com/Codeer-Software/Friendly.Windows/blob/master/Project/CodeerFriendlyWindowsCore/dllmain.cpp
でもそれだけで.NetCore対応できたってすごいなー。現行のWinFormsとかWPFも結構さらっと移行できるんじゃないかなー。(こなみかん
不具合対応
実は前回の2.13.1に不具合がありました。操作プロセスが管理者権限で対処プロセスが普通権限の場合に操作対象が不正終了してしまうようでした。修正しておきました。不具合報告をくれた方、ありがとうございました!