ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

Friendly、ラムダ送れるってよ

いや、ちょっとタイトルは正確さに欠けますが、ご容赦を。

今日は、驚きの発見がありました。
FriendlyユーザーのITO(仮名)さんと話していると

ITO「こんな感じでテスト書いたらいいと思うんですよね。」
石「でもこのコード、ラムダ使ってますよ。プロセス違うからラムダなんて送れるわけないじゃん。」
ITO「え?でも送れましたよ?」
石「なん…だと…!?」

こんなコードが書けたのです。

上の話の時のコードとは違うけど、つまりは以下のようなコードが書けたのです。

public void ラムダが送れた()
{
    WindowsAppExpander.LoadAssembly(_app, GetType().Assembly);

    //メインウィドウのタイトルを表示
    Action a1 = () => MessageBox.Show(Process.GetCurrentProcess().MainWindowTitle);

    //Actionを転送
    var a2 = _app.Copy(a1);

    //対象プロセス内で実行
    a2.Invoke();
}

???なんで?
作者は想定外ですw

Friendlyで送れるのは以下のもの
シリアライズ可能なオブジェクト
②AppVar
③DynamicAppVar
④IAppVarOwner

②③④ではありえないので、
Actionは①ってことになります。

つまりDelegateシリアライズ可能なこともある

ということですね。
知らんかった。
「可能なこともある」
ってボンヤリしてますね。
以下ちょっと実験しましたけど、可能/不可能の境界線はまだ調べられてないです。

public void シリアライズ可能()
{
    var formatter = new BinaryFormatter();
    using (var stream = new MemoryStream())
    {
        //これはシリアライズできた
        Action a1 = () => MessageBox.Show("");
        formatter.Serialize(stream, a1);

        //これは無理
        string text = "";
        Action a2 = () => MessageBox.Show(text);
        formatter.Serialize(stream, a2);
    }
}

どこまでいけるんだろ?
IL調べたらわかるのかな?
@Posauneさんとか、この辺りブログ書いてくれないかなー。

何か面白い機能追加できそう!

とにかく可能性が広がりました!
なんか面白機能をFriendlyの基本部分に追加できそうです。
ITOさん、センキューで~す(チャラい

そしてこんな面白いことができるFriendlyのハンズオンがあります。

宣伝w。残席まだあります。ご参加お待ちしております!

東京会場SHIFT様(9/19)madoguchi100.connpass.com

大阪会場ベリサーブ様(9/24)vshtc.doorkeeper.jp