Friendly.UWP_α 0.0.1 をリリースしました!
Friendly.UWP_α 0.0.1 をリリースしました!
なんと、種も仕掛けもないUWPアプリのAPIを外部から呼べるのです!
(制限はあるw
www.nuget.org
まずは体験してみてください。
ここからサンプルをダウンロード
github.com
ダウンロードはこのボタンです。
解凍前にブロックを解除してくださいねー。
それで、Sample_UWP_1-master/Project/Sample/Sample.slnを開きます。
実行すると・・・
解説
コードは次のようになっています。
using Microsoft.VisualStudio.TestTools.UnitTesting; using Friendly.UWP; using Codeer.Friendly.Dynamic; using EnvDTE80; using System.IO; using VSHTC.Friendly.PinInterface; namespace Sample { [TestClass] public class Demo { [TestMethod] public void Test() { using (var app = new UWPAppFriend(new ByVisualStudio(Path.GetFullPath("../../../TargetApp/TargetApp.sln")) { //Visual Studio 2015のパス 違ったら変えてね。 VisualStudioPath = @"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe", //ソリューションの構成 //Debugのx86を選択 ChangeVisualStudioSetting = (vs, dteSrc) => { var dte = dteSrc.Pin<DTE2>(); dte.Solution.SolutionBuild.SolutionConfigurations.Item(3).Activate(); } })) { var current = app.Type("Windows.UI.Xaml.Window").Current; var mainPage = current.Content.Content; //定義したメソッドを呼びだし string ret = mainPage.Func(10); Assert.AreEqual("10", ret); //背景色変更 var color = app.Type("Windows.UI.Colors").Blue; var brush = app.Type("Windows.UI.Xaml.Media.SolidColorBrush")(color); mainPage.Content.Background = brush; } } } }
α0.01では対象のUWPをVisualStudioを使って起動するようにしています。対象のプロジェクトを開いたVisualStudioがあれば、それを使います。なければ、VisualStudioPathでパスを設定したものを起動して対象のソリューションを開きます。ChangeVisualStudioSettingは何かというと、ソリューションを開いた後のVisualStudioの設定を変えています。デバッグモードで実行する必要があるので、ソリューションの構成を変えています。これも開いた状態で期待のソリューション構成になっているなら、設定しなくてもOKです。
残りのコードは普通の(?)Friendlyのコードです。内部メソッドを呼び出せています。
あ、ちなみにChangeVisualStudioSettingは、Friendly.WindowsとFrinedly.PinInterfaceを使ってVisualStudioを外部から操作します。こちらを参照お願いします。
ishikawa-tatsuya.hatenablog.com
内部解説
Friendyはご存知の通り、操作したいプロセスの内側に、言うことを聞いてくれるモジュールを送り込み、それに指令を送って処理を実行させます。通常のデスクトップアプリ版はDLLインジェクションとCOMによるCLR操作でそれを実現していますが、UWPにはこの方法が効かないのです。
で、どうしたかと言うと、VisualStudioのイミディエイトの機能を使っています。App.InitializeComponentという関数でブレイクさせて、そこでイミディエイトでアセンブリのロードと指令を受信するモジュールの起動を実行しているのです。
あ、App.InitializeComponentという関数を消したり名前を変えている人はByVisualStudioのInjectionBreakPointというプロパティーでブレイクする関数を変更できます。
インジェクションしなくてもいいですよね?
今はインジェクションしてます。結構無理やりですw
でもここ以外には無理はないのですよね。
通信とリフレクションだけなので。
だから、そこは無理せずに対象のアプリにロードしておいてもらうのもいいかなーって思っています。
こんな構成ならいいでしょ?
次のバージョンからは
対象アプリに最初からロードしてもらう手法も詰めていきます。
それから、基本的なコントロールの操作のラッパークラスもこのライブラリに定義していこうかなー。
乞うご期待!
あ、それからOSSですので一緒に作ってくれる人も募集中です!