Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Porting Windows Forms App to Xamarin.Mac
Search
ailen0ada
May 07, 2016
Programming
1
3.7k
Porting Windows Forms App to Xamarin.Mac
2016/5/7 JXUGC #13 の発表資料です。
ailen0ada
May 07, 2016
Tweet
Share
More Decks by ailen0ada
See All by ailen0ada
How we create our app using Xamarin;
ailen0ada
3
2.2k
.NET Conf 2017 Tokyo, Japan
ailen0ada
1
210
Say hello to Cocoa development with Xamarin.Mac
ailen0ada
1
180
Other Decks in Programming
See All in Programming
FluorTracer / RayTracingCamp11
kugimasa
0
220
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
160
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
600
配送計画の均等化機能を提供する取り組みについて(⽩⾦鉱業 Meetup Vol.21@六本⽊(数理最適化編))
izu_nori
0
150
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
3
800
STYLE
koic
0
160
開発に寄りそう自動テストの実現
goyoki
1
770
認証・認可の基本を学ぼう前編
kouyuume
0
190
SwiftUIで本格音ゲー実装してみた
hypebeans
0
110
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
200
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
390
Microservices Platforms: When Team Topologies Meets Microservices Patterns
cer
PRO
1
1k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.2k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Writing Fast Ruby
sferik
630
62k
Agile that works and the tools we love
rasmusluckow
331
21k
Mobile First: as difficult as doing things right
swwweet
225
10k
Code Review Best Practice
trishagee
74
19k
Scaling GitHub
holman
464
140k
Visualization
eitanlees
150
16k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
[SF Ruby Conf 2025] Rails X
palkan
0
500
Transcript
Porting Windows Forms App to Xamarin.Mac Cuminas Corporation Tsubasa HIRANO
@ailen0ada 2016/5/7 JXUGC#13
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
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
Xamarin.Mac nowadays 2016/5/7 JXUGC #13 TOKYO 4
Xamarin.Mac is... C# という共通言語でMac プラットフォームとお話しできる =ほとんどフルの.NET Framework + OSX API
Binding Mac向けアプリケーション開発環境 ◦ Xamarin.Forms 非対応 ◦ VisualStudio 非対応 ◦ Xamarin University クラスなし 2016/5/7 JXUGC #13 TOKYO 5
Windows Forms 意外と強力なクロスプラットフォームフレームワーク ◦ Mono の互換実装 WinForms により Linux, Mac
でも動作可能 ◦ Windows でビルドした exe ファイルを Mono 経由で叩くだけ ◦ Wine との相性も◎ 標準コントロールだけの業務アプリなら別にこれでよし? 2016/5/7 JXUGC #13 TOKYO 6
Gochiusearch アニメご注文はうさぎですか?全画像約100万枚を対象とした 検索エンジン 2016/5/7 JXUGC #13 TOKYO 7
Gochiusearch 選定の理由 Mac といえば Cocoa ◦ ココアさん推しです Windows Forms で作られている
◦ 3 プラットフォームで共通のUIで動作する 大きすぎず,適度な難易度 ◦ グラフィックス周り ◦ ドラッグ&ドロップ(ファイル&ブラウザ) とにかく堂々と発表できる事例が作りたかった 2016/5/7 JXUGC #13 TOKYO 8
Demo MONO,MONOMAC,APPSTORE 2016/5/7 JXUGC #13 TOKYO 9
そりゃまあ動くけど Macでのユーザーインタフェースは問題だらけ ◦ メニューバーがクリックできない ◦ アプリケーション名がmono, アイコンも変更できない ◦ フォントレンダリングがちょっと… ◦
ブラウザからのドラッグ&ドロップに対応できない 動作するのと,快適に使うことができるかは別問題 2016/5/7 JXUGC #13 TOKYO 10
試作: MonoMac で薄くラップする バンドル化の機能を使う ◦ mkbundle でもできるはず,うまくいかなかった ◦ MainForm.cs のドラッグ&ドロップ周りだけオーバーライドする
ユーザーインタフェースの問題は解決しない ◦ WinForms には変わりない ◦ ただ Mac アプリっぽく振る舞うことはできるようになる コレジャナイ 2016/5/7 JXUGC #13 TOKYO 11
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
Xamarin.Mac Mobile Framework 可能な限りこのフレームワークを使う ◦ ランタイムがiOS向けチューンされたものと同等になる ◦ ライブラリのリンクが可能,バイナリサイズの削減=起動時間の短縮 ◦ .NETアセンブリはPCL限定,Cocoa
側はフルに利用可能 ImageSearch ライブラリのPCL化 System.Drawing.Graphics の排除 2016/5/7 JXUGC #13 TOKYO 13
ImageSearch を移植可能に 2016/5/7 JXUGC #13 TOKYO 14 ImageSearchEngine DB読み込み 画像
読み込み 画像の縮小 ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 System.IO.FileStream System.Drawing.Bitmap System.Drawing.Rectangle プラットフォーム依存なし System.Drawing.Graphics
ImageSearch を移植可能に 2016/5/7 JXUGC #13 TOKYO 15 ImageSearchEngine.Portable DB読み込み 画像の縮小
ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 PCLStorage XMSearch 画像 読み込み CGImage 経由で画像の読み込み 32bppARGB のバイト列に展開
Sandboxing セキュリティの向上,AppStore 提出基準への適合 ◦ ユーザーが指定したファイル・フォルダのみ読み書き可能 ◦ ネットワークアクセスなども制限 ◦ アプリケーションの生成したファイルはすべてコンテナフォルダへ ◦
~/Library/Containers/{app bundle name}/Data ◦ Environment.SpecialFolderも影響を受ける SecurityException は送出されない ◦ 行おうとした操作によって例外は異なる コンソールで特定 ◦ ex) Outgoing connectionを許可していなかった場合はWebException – 名前解決エラー ◦ mDNSResponderへのアクセスが拒否されるため 2016/5/7 JXUGC #13 TOKYO 16
Cocoaの使いどころ 画像かどうかの判定 ◦ 元ソースでは拡張子による判定 ◦ Macではシステムがある程度判別してくれる=Uniform Type Identifier ◦ UTI
が画像だったら CGImage も大体作れる パスの分解・結合をNSString/NSUrl にやらせる ◦ PathComponents を使って部分パスの取得や追加ができる CGImageによる画像読み込み,ローカライゼーション 無理に共通化にこだわらない ◦ プラットフォームAPIを使った方が高速,便利な場面を見極める 2016/5/7 JXUGC #13 TOKYO 17
Practice まず Full Mono で動くところまで持って行く ◦ ユーザーインタフェースをXcodeで作って,元ソースを切り貼りする ◦ MessageBoxなどコモンダイアログ系はこの段階で移行 Mobile
Frameworkに変更してみる ◦ 動けばよし,動かない点をピックアップする ◦ データアクセス部分をPCLにしていけばほぼ終わり どうにもならないときだけ Xamarin.Mac 4.5 Framework ◦ PCL として配布されてないNuGet パッケージに依存している場合で, 代替もないときに限られるはず 2016/5/7 JXUGC #13 TOKYO 18
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
Now available on the App Store 2016/5/7 JXUGC #13 TOKYO
20
Thank you. より詳細なステップバイステップはブログで http://aile.hatenablog.com/ 2016/5/7 JXUGC #13 TOKYO 21