Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
PyCon mini 東海 2025「個人ではじめるマルチAIエージェント入門 〜LangChain × LangGraphでアイデアを形にするステップ〜」
komofr
3
1.1k
Eloquentを使ってどこまでコードの治安を保てるのか?を新人が考察してみた
itokoh0405
0
3.2k
Chart.jsで長い項目を表示するときのハマりどころ
yumechi
0
130
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
170
2025 컴포즈 마법사
jisungbin
0
130
オフライン対応!Flutterアプリに全文検索エンジンを実装する @FlutterKaigi2025
itsmedreamwalker
2
220
歴史から学ぶ「Why PHP?」 PHPを書く理由を改めて理解する / Learning from History: “Why PHP?” Rediscovering the Reasons for Writing PHP
seike460
PRO
0
160
ノーコードからの脱出 -地獄のデスロード- / Escape from Base44
keisuke69
1
750
Building AI with AI
inesmontani
PRO
0
230
SUZURIの規約違反チェックにおけるクリエイタフィードバックの試⾏錯誤/Trial and Error in Creator Feedback for SUZURI's Terms of Service Violation Checks
ae14watanabe
1
160
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
1.9k
AIの弱点、やっぱりプログラミングは人間が(も)勉強しよう / YAPC AI and Programming
kishida
9
5.1k
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
330
KATA
mclloyd
PRO
32
15k
Designing for Performance
lara
610
69k
Site-Speed That Sticks
csswizardry
13
970
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
[RailsConf 2023] Rails as a piece of cake
palkan
57
6.1k
The Pragmatic Product Professional
lauravandoore
36
7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
4 Signs Your Business is Dying
shpigford
186
22k
How STYLIGHT went responsive
nonsquared
100
5.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
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