xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

Friendlyエバンジェリストはミニスカサンタ

2014 年 12 月 20 日 (土) に日本マイクロソフト品川本社で開催された CLR/H in Tokyo 第 7 回に参加してきました 。ドレスコードが仮装というカソウ化デーということで、主催者 (@naoki0311) とその一味 (@miso_soup3) のご要望にお応えしてミニスカサンタ姿でのセッションでした。「北陸の草食系ミニスカサンタっていうからみそ先生のコスを期待してたのに、お前かいッ!」という至極真っ当な怒りをぶつけられつつも、めげずに頑張りました。そんな奇怪な姿を Facebook で目撃してしまった方々は大変お見苦しかったかとは思いますが、ご容赦ください。(僕は被写体なだけで、アップロードしているのは僕ではないと言い張る)

受け持ったセッションでは、株式会社 Codeer の代表を務める @StoneGuitar777 さんが作成した超強力なテスト自動化ライブラリである Friendly を紹介させて頂きました。今年の 11 月に米国 Microsoft 本社で行われた MVP Global Summit 2014 の一大イベントのひとつである MVP Showcase で 2 位を獲得したクレイジーなヤツです。

ちなみに、本記事は Friendly Advent Calendar 2014 の記事としても公開しています。Friendly の作成秘話やサンプルアプリケーション、さらには非常に素晴らしいハンズオン学習などが公開されています。是非 ×2 ご覧ください!

Friendly Advent Calendar 2014

PowerPoint資料

デモのソースコード (一部)

デモンストレーションでは、3 つのサンプルアプリとライブコーディングをご覧頂きました。ライブコーディングで使ったソースコードのうち、エッセンスのみ掲載します。

using System;
using System.Windows.Forms;

namespace TargetApp
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            this.InitializeComponent();
        }
        private readonly string xMas = "ミニスカサンタ";  //--- privateだろうと関係ない
        private static string GetNow() => "今の時間は \{DateTime.Now} です";
    }
}
using System;
using System.Diagnostics;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using Codeer.Friendly.Dynamic;
using Codeer.Friendly.Windows;


namespace OperatorApp
{
    class Program
    {
        static void Main()
        {
            //--- プロセス起動
            var path = @"TargetApp.exeへのPathを記載";
            var process = Process.Start(path);

            //--- プロセスにアタッチ
            var targetApp = new WindowsAppFriend(process);

            //--- staticメソッドの呼び出し
            var now = targetApp.Type("TargetApp.MainForm").GetNow();
            Console.WriteLine(now);

            //--- プロパティの参照
            var form = targetApp.Type<Application>().OpenForms[0];
            Console.WriteLine(form.Text);

            //--- プロパティの編集
            form.BackColor = Color.LightPink;

            //--- private変数の参照
            Console.WriteLine(form.xMas);

            //--- ComboBoxを動的に追加
            var comboBox = targetApp.Type<ComboBox>()();
            comboBox.Items.Add("xin9le");
            comboBox.Items.Add("ナオキ");
            comboBox.Items.Add("緑のタイツ");
            form.Controls.Add(comboBox);

            //--- 追加したComboBoxから値を取得
            Console.WriteLine(comboBox.SelectedItem);

            //--- dllインジェクション
            WindowsAppExpander.LoadAssembly(targetApp, Assembly.GetExecutingAssembly());
            targetApp.Type(typeof(Program)).ShowMessageBox();  //--- 相手プロセス上で以下に定義したメソッドを呼び出す

            //--- 終了
            process.CloseMainWindow();
            process.WaitForExit();
        }

        private static void ShowMessageBox()
        {
            var caption = "CLR/H in Tokyo";
            var message = "このアセンブリを読み込ませて、相手プロセス側から実行しています。";
            var button = MessageBoxButtons.OK;
            var icon = MessageBoxIcon.Error;
            MessageBox.Show(message, caption, button, icon);
        }
    }
}

いかがでしょうか?とっても難しそうなことがかなり自然な記述で、いとも簡単に実現できてしまいます。ぜひ、F10 によるステップ実行デバッグで遊んでみてください。そんな黒魔法チックな Friendly は Open Source で、かつ無料です!興味を持った方は今すぐ NuGet からダウンロード!

PM> Install-Package Codeer.Friendly.Windows