Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Porting Windows Forms App to Xamarin.Mac

Porting Windows Forms App to Xamarin.Mac

2016/5/7 JXUGC #13 の発表資料です。

ailen0ada

May 07, 2016
Tweet

More Decks by ailen0ada

Other Decks in Programming

Transcript

  1. Porting Windows Forms App to
    Xamarin.Mac
    Cuminas Corporation
    Tsubasa HIRANO @ailen0ada
    2016/5/7 JXUGC#13

    View Slide

  2. About me
    平野 翼 a.k.a. Xamarin.Macの人
    ◦ クミナス株式会社 と 五反田の会社
    ◦ Xamarin 3年生
    ◦ Blog: http://aile.hatenablog.com/
    ◦ Facebook: ailen0ada
    ◦ Twitter: @ailen0ada
    2016/5/7 JXUGC #13 TOKYO 2

    View Slide

  3. Agenda
    1. Did you know Xamarin.Mac?
    2. Remember Windows Forms
    3. Introducing Gochiusearch
    4. Develop strategy of porting App
    5. Summary
    2016/5/7 JXUGC #13 TOKYO 3

    View Slide

  4. Xamarin.Mac nowadays
    2016/5/7 JXUGC #13 TOKYO 4

    View Slide

  5. Xamarin.Mac is...
    C# という共通言語でMac プラットフォームとお話しできる
    =ほとんどフルの.NET Framework + OSX API Binding
    Mac向けアプリケーション開発環境
    ◦ Xamarin.Forms 非対応
    ◦ VisualStudio 非対応
    ◦ Xamarin University クラスなし
    2016/5/7 JXUGC #13 TOKYO 5

    View Slide

  6. Windows Forms
    意外と強力なクロスプラットフォームフレームワーク
    ◦ Mono の互換実装 WinForms により Linux, Mac でも動作可能
    ◦ Windows でビルドした exe ファイルを Mono 経由で叩くだけ
    ◦ Wine との相性も◎
    標準コントロールだけの業務アプリなら別にこれでよし?
    2016/5/7 JXUGC #13 TOKYO 6

    View Slide

  7. Gochiusearch
    アニメご注文はうさぎですか?全画像約100万枚を対象とした
    検索エンジン
    2016/5/7 JXUGC #13 TOKYO 7

    View Slide

  8. Gochiusearch 選定の理由
    Mac といえば Cocoa
    ◦ ココアさん推しです
    Windows Forms で作られている
    ◦ 3 プラットフォームで共通のUIで動作する
    大きすぎず,適度な難易度
    ◦ グラフィックス周り
    ◦ ドラッグ&ドロップ(ファイル&ブラウザ)
    とにかく堂々と発表できる事例が作りたかった
    2016/5/7 JXUGC #13 TOKYO 8

    View Slide

  9. Demo
    MONO,MONOMAC,APPSTORE
    2016/5/7 JXUGC #13 TOKYO 9

    View Slide

  10. そりゃまあ動くけど
    Macでのユーザーインタフェースは問題だらけ
    ◦ メニューバーがクリックできない
    ◦ アプリケーション名がmono, アイコンも変更できない
    ◦ フォントレンダリングがちょっと…
    ◦ ブラウザからのドラッグ&ドロップに対応できない
    動作するのと,快適に使うことができるかは別問題
    2016/5/7 JXUGC #13 TOKYO 10

    View Slide

  11. 試作: MonoMac で薄くラップする
    バンドル化の機能を使う
    ◦ mkbundle でもできるはず,うまくいかなかった
    ◦ MainForm.cs のドラッグ&ドロップ周りだけオーバーライドする
    ユーザーインタフェースの問題は解決しない
    ◦ WinForms には変わりない
    ◦ ただ Mac アプリっぽく振る舞うことはできるようになる
    コレジャナイ
    2016/5/7 JXUGC #13 TOKYO 11

    View Slide

  12. Xamarin! Xamarin! Xamarin!
    1. Windows プラットフォーム依存コードを洗い出す
    ◦ System.Drawing, System.Windows 名前空間への依存
    2. ユーザーインタフェースを xib で実装
    ◦ Storyboard を使うと 10.9 で起動できなくなる
    3. ImageSearch はそのままに,まず Full Mono で実装
    4. ImageSearch を PCL 化,Xamarin.Mac Mobile に移行
    5. AppStore 提出
    2016/5/7 JXUGC #13 TOKYO 12

    View Slide

  13. Xamarin.Mac Mobile Framework
    可能な限りこのフレームワークを使う
    ◦ ランタイムがiOS向けチューンされたものと同等になる
    ◦ ライブラリのリンクが可能,バイナリサイズの削減=起動時間の短縮
    ◦ .NETアセンブリはPCL限定,Cocoa 側はフルに利用可能
    ImageSearch ライブラリのPCL化
    System.Drawing.Graphics の排除
    2016/5/7 JXUGC #13 TOKYO 13

    View Slide

  14. ImageSearch を移植可能に
    2016/5/7 JXUGC #13 TOKYO 14
    ImageSearchEngine
    DB読み込み
    画像
    読み込み
    画像の縮小
    ビット
    ベクトル
    算出
    ハミング
    距離
    算出
    DBの検索




    System.IO.FileStream
    System.Drawing.Bitmap
    System.Drawing.Rectangle
    プラットフォーム依存なし
    System.Drawing.Graphics

    View Slide

  15. ImageSearch を移植可能に
    2016/5/7 JXUGC #13 TOKYO 15
    ImageSearchEngine.Portable
    DB読み込み 画像の縮小
    ビット
    ベクトル
    算出
    ハミング
    距離
    算出
    DBの検索




    PCLStorage
    XMSearch
    画像
    読み込み
    CGImage 経由で画像の読み込み
    32bppARGB のバイト列に展開

    View Slide

  16. Sandboxing
    セキュリティの向上,AppStore 提出基準への適合
    ◦ ユーザーが指定したファイル・フォルダのみ読み書き可能
    ◦ ネットワークアクセスなども制限
    ◦ アプリケーションの生成したファイルはすべてコンテナフォルダへ
    ◦ ~/Library/Containers/{app bundle name}/Data
    ◦ Environment.SpecialFolderも影響を受ける
    SecurityException は送出されない
    ◦ 行おうとした操作によって例外は異なる コンソールで特定
    ◦ ex) Outgoing connectionを許可していなかった場合はWebException – 名前解決エラー
    ◦ mDNSResponderへのアクセスが拒否されるため
    2016/5/7 JXUGC #13 TOKYO 16

    View Slide

  17. Cocoaの使いどころ
    画像かどうかの判定
    ◦ 元ソースでは拡張子による判定
    ◦ Macではシステムがある程度判別してくれる=Uniform Type Identifier
    ◦ UTI が画像だったら CGImage も大体作れる
    パスの分解・結合をNSString/NSUrl にやらせる
    ◦ PathComponents を使って部分パスの取得や追加ができる
    CGImageによる画像読み込み,ローカライゼーション
    無理に共通化にこだわらない
    ◦ プラットフォームAPIを使った方が高速,便利な場面を見極める
    2016/5/7 JXUGC #13 TOKYO 17

    View Slide

  18. Practice
    まず Full Mono で動くところまで持って行く
    ◦ ユーザーインタフェースをXcodeで作って,元ソースを切り貼りする
    ◦ MessageBoxなどコモンダイアログ系はこの段階で移行
    Mobile Frameworkに変更してみる
    ◦ 動けばよし,動かない点をピックアップする
    ◦ データアクセス部分をPCLにしていけばほぼ終わり
    どうにもならないときだけ Xamarin.Mac 4.5 Framework
    ◦ PCL として配布されてないNuGet パッケージに依存している場合で,
    代替もないときに限られるはず
    2016/5/7 JXUGC #13 TOKYO 18

    View Slide

  19. Unleash the power of Xamarin.Mac
    .NET と Cocoa のいいとこ取りができる
    ◦ すべてを .NET Framework 内で完結する必要はない
    ◦ Mac には Mac の流儀がある!
    ◦ もちろん共通項は PCL にまとめておける
    フル機能の Mono を使うこともできる
    ◦ System.Drawing とか System.Configuration に依存していても大丈夫
    ◦ 期待通りに動作しない部分だけ Cocoa を使えばいい
    デバッグが高速,シミュレータなんて不要!すぐ試せます
    2016/5/7 JXUGC #13 TOKYO 19

    View Slide

  20. Now available on the App Store
    2016/5/7 JXUGC #13 TOKYO 20

    View Slide

  21. Thank you.
    より詳細なステップバイステップはブログで
    http://aile.hatenablog.com/
    2016/5/7 JXUGC #13 TOKYO 21

    View Slide