狠狠撸

狠狠撸Share a Scribd company logo
Win/Mac/Android/iOS向け
クロスプラットフォーム開発にXamarinが
うまくハマりそうだった話
JXUGC #13 東京
2016/5/7 @_pochi
目次
? 自己紹介
? 开発事例绍介
– アプリ概要
– アーキテクチャ
– コード共通化事情
– Binding事情
? まとめ
– なぜうまくハマったか
– 楽しかった思い出
– 辛かった思い出
自己紹介
? 菊池 琢弥 (@_pochi)
– P2P技術ベンチャーに勤務
? Slack用の絵文字を描く人 兼 エンジニア
– 社内ひとりC#er
– 埼玉県民
开発事例绍介
アプリ概要
? サーバ/クライアント間ファイル転送アプリ
の、クライアントアプリケーション
– FTPクライアント的なものです↓
? 対象OS:
– Android
– iOS
– Windows(Desktop)
– OSX
アプリ概要
C++ C# (.NET / Xamarin)
アーキテクチャ
ViewModelModel
Native
Library
(ファイル転送
機能を提供)
Binding
Binding
オレオレ
Binding
P/Invoke
Callback
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? コア機能を提供するNativeLibraryを抱いたC#アプリ
? C#レイヤはMVVMパターンに従って設計
– 各プラットフォーム向けにViewを実装
コード共通化事情
どれくらい楽できたのかな
Modelのコード共通化事情
C++ C# (.NET / Xamarin)
ViewModelModel
Native
Library
(ファイル転送
機能を提供)
Binding
Binding
オレオレ
Binding
P/Invoke
Callback
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? 全プラットフォームでほぼ全て共通化
– NativeLibraryの薄いラッパでしかないのでそんなもんか
– P/Invoke周りが無事動いてホッとした
Modelのコード共通化事情
C++ C# (.NET / Xamarin)
ViewModelModel
Native
Library
(ファイル転送
機能を提供)
Binding
Binding
オレオレ
Binding
P/Invoke
Callback
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? 全プラットフォームでほぼ全て共通化
– NativeLibraryの薄いラッパでしかないのでそんなもんか
– P/Invoke周りが無事動いてホッとした
(余談)
基本的にOS依存はboostやSTLが吸収して
くれてたみたい
「clangでビルド通るのにVC++で通らない」
という悲鳴はよく聞こえた
ViewModelのコード共通化事情
C# (.NET / Xamarin)
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? Win/OSXのデスクトップOSどうしは90%程度共通
? Android/iOSのモバイルOSどうしも90%程度共通
– 共通化できない処理はDependency Injection
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
? Win/OSXのデスクトップOSどうしは90%程度共通
? Android/iOSのモバイルOSどうしも90%程度共通
– 共通化できない処理はDependency Injection
C# (.NET / Xamarin)
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
ViewModelのコード共通化事情
Desktop/Mobile間はざっくりとこんな感じ
だと思います
Win/OSX
Android/iOS
Desktop/Mobile
? サーバ上のファイル一覧画面ViewModel
– Desktop/Mobileで表示方法は異なるが、ViewModelクラスは同一
ViewModelのコード共通化事情
ViewModelのコード共通化事情
? ファイル転送処理の進捗画面ViewModel
– モバイル/Desktopで画面遷移は異なるが、ViewModelクラスは同一
C# (.NET / Xamarin)
Viewのコード共通化事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? Android/iOSはXamarin.Formsの力でほぼ共通化
? Win/OSXはそれぞれ別々に実装。共通化はできてない
– おかげでOSネイティブのUXを得られたので悪いことばかりではない
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
BINDING事情
これがないと話にならない
C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
ごくふつうのWPFアプリなので当然
C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
辛いところも多いが、
思い返せばXamarin.Forms最高でした
C# (.NET / Xamarin)
Binding事情
ViewModelModel
Binding
Binding
オレオレ
Binding
Win向けView
(WPF)
モバイル向けView
(Xamarin.Forms)
OSX向けView
(Xamarin.Mac)
? おや、Macのようすが
C++
Native
Library
(ファイル転送
機能を提供)
P/Invoke
Callback
いい感じのBindingフレームワークが無
かった
(reactiveui、MvvmCrossといった
フレームワークは存在しますが、
少なくとも当時は必要な機能がそろっていなかった。。。)
→泣く泣くバインディング処理を
自前で実装
おかげでCocoaと仲良しになれました
まとめ
なぜXamarinがいい感じにハマったか
? アプリのコア部分がNative Library化されていた
– プラットフォーム依存処理(ファイル入出力とか)をNativeLibraryが吸収してくれた
? おかげで、「.NET/Monoの細かい挙動の違い」はあまり気にならなかった
– C#のネイティブライブラリ呼び出し周りのケアが非常に手厚いからこそ
? 関数ポインタ渡し、構造体のアラインメント、呼び出し規約、、、等々
? Xamarinでもきちんと動いてくれる
– パフォーマンスが最重要な部分は、黒魔術師たちがC++使ってカリカリにチューニング。
フロントエンドはC#で生産性高く、というスタイル。
? (C#が遅いとはいってない)
? (C++が生産性低いとはいってない)
? Desktop/Mobile横断の開発だった
– Desktopだけ、Mobileだけ、ではなかった
? DesktopだけならJavaでもいいよね!となることもあり得たかもしれない
? そこまで凝ったUIが求められなかった
– おかげでXamarin.Formsが最高で助かった
よかったところ
? クロスプラットフォーム開発ながら、Visual Studioメインで開発できた
– VSでデバッグ時、NativeLibrary側にもシームレスにステップインできるのが、
特に素晴らしい
– まずWindows向けに機能実装してから他プラットフォームに取り掛かればいい
? Win環境で実装~テストまでほとんど済ませたうえで他OS向け作業に取り掛かれる
? P/Invoke周りの不安はすべて朴鬱だった
– DllImportのDLL検索がやたら柔軟
– 呼び出し規約とか
– 構造体のアラインメントとか
– ネイティブ側に関数ポインタどうやってわたすの?とか
? Xamarin.iOSでは制限は多いが…
– どれもどうにかなる手段が用意されていた
つらかったところ
? Xcode(InterfaceBuilder)が気難しい
– 慣れの問題だとは思うが…
? MacのBinding
– オレオレ実装とか正直やりたくないし、やるべきでないと思う
– MvvmCrossとか、使えるようになってるといいな
– このあたりが整備されてきたら、Xamarinはデスクトップ向けクロスプラット
フォーム開発環境として本当に有力な選択肢になりえると思う
? デスクトップアプリ自体もうそんな流行らないかな…
? Xamarin.MacでInvalidProgramExceptionが結構起きる
– 深追いしてないが、書き方を変えるときちんと動いたりする
? Xamarin.FormsのXAML≠WPFのXAML
– 特にBehaviorのBindingPropertyあたりでハマった
おしまい

More Related Content

Win/Mac/Android/iOS向け クロスプラットフォーム開発にXamarinが うまくハマりそうだった話

  • 2. 目次 ? 自己紹介 ? 开発事例绍介 – アプリ概要 – アーキテクチャ – コード共通化事情 – Binding事情 ? まとめ – なぜうまくハマったか – 楽しかった思い出 – 辛かった思い出
  • 3. 自己紹介 ? 菊池 琢弥 (@_pochi) – P2P技術ベンチャーに勤務 ? Slack用の絵文字を描く人 兼 エンジニア – 社内ひとりC#er – 埼玉県民
  • 7. C++ C# (.NET / Xamarin) アーキテクチャ ViewModelModel Native Library (ファイル転送 機能を提供) Binding Binding オレオレ Binding P/Invoke Callback Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? コア機能を提供するNativeLibraryを抱いたC#アプリ ? C#レイヤはMVVMパターンに従って設計 – 各プラットフォーム向けにViewを実装
  • 9. Modelのコード共通化事情 C++ C# (.NET / Xamarin) ViewModelModel Native Library (ファイル転送 機能を提供) Binding Binding オレオレ Binding P/Invoke Callback Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? 全プラットフォームでほぼ全て共通化 – NativeLibraryの薄いラッパでしかないのでそんなもんか – P/Invoke周りが無事動いてホッとした
  • 10. Modelのコード共通化事情 C++ C# (.NET / Xamarin) ViewModelModel Native Library (ファイル転送 機能を提供) Binding Binding オレオレ Binding P/Invoke Callback Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? 全プラットフォームでほぼ全て共通化 – NativeLibraryの薄いラッパでしかないのでそんなもんか – P/Invoke周りが無事動いてホッとした (余談) 基本的にOS依存はboostやSTLが吸収して くれてたみたい 「clangでビルド通るのにVC++で通らない」 という悲鳴はよく聞こえた
  • 11. ViewModelのコード共通化事情 C# (.NET / Xamarin) ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? Win/OSXのデスクトップOSどうしは90%程度共通 ? Android/iOSのモバイルOSどうしも90%程度共通 – 共通化できない処理はDependency Injection C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback
  • 12. C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback ? Win/OSXのデスクトップOSどうしは90%程度共通 ? Android/iOSのモバイルOSどうしも90%程度共通 – 共通化できない処理はDependency Injection C# (.NET / Xamarin) ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ViewModelのコード共通化事情 Desktop/Mobile間はざっくりとこんな感じ だと思います Win/OSX Android/iOS Desktop/Mobile
  • 15. C# (.NET / Xamarin) Viewのコード共通化事情 ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? Android/iOSはXamarin.Formsの力でほぼ共通化 ? Win/OSXはそれぞれ別々に実装。共通化はできてない – おかげでOSネイティブのUXを得られたので悪いことばかりではない C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback
  • 17. C# (.NET / Xamarin) Binding事情 ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? おや、Macのようすが C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback
  • 18. C# (.NET / Xamarin) Binding事情 ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? おや、Macのようすが C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback ごくふつうのWPFアプリなので当然
  • 19. C# (.NET / Xamarin) Binding事情 ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? おや、Macのようすが C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback 辛いところも多いが、 思い返せばXamarin.Forms最高でした
  • 20. C# (.NET / Xamarin) Binding事情 ViewModelModel Binding Binding オレオレ Binding Win向けView (WPF) モバイル向けView (Xamarin.Forms) OSX向けView (Xamarin.Mac) ? おや、Macのようすが C++ Native Library (ファイル転送 機能を提供) P/Invoke Callback いい感じのBindingフレームワークが無 かった (reactiveui、MvvmCrossといった フレームワークは存在しますが、 少なくとも当時は必要な機能がそろっていなかった。。。) →泣く泣くバインディング処理を 自前で実装 おかげでCocoaと仲良しになれました
  • 22. なぜXamarinがいい感じにハマったか ? アプリのコア部分がNative Library化されていた – プラットフォーム依存処理(ファイル入出力とか)をNativeLibraryが吸収してくれた ? おかげで、「.NET/Monoの細かい挙動の違い」はあまり気にならなかった – C#のネイティブライブラリ呼び出し周りのケアが非常に手厚いからこそ ? 関数ポインタ渡し、構造体のアラインメント、呼び出し規約、、、等々 ? Xamarinでもきちんと動いてくれる – パフォーマンスが最重要な部分は、黒魔術師たちがC++使ってカリカリにチューニング。 フロントエンドはC#で生産性高く、というスタイル。 ? (C#が遅いとはいってない) ? (C++が生産性低いとはいってない) ? Desktop/Mobile横断の開発だった – Desktopだけ、Mobileだけ、ではなかった ? DesktopだけならJavaでもいいよね!となることもあり得たかもしれない ? そこまで凝ったUIが求められなかった – おかげでXamarin.Formsが最高で助かった
  • 23. よかったところ ? クロスプラットフォーム開発ながら、Visual Studioメインで開発できた – VSでデバッグ時、NativeLibrary側にもシームレスにステップインできるのが、 特に素晴らしい – まずWindows向けに機能実装してから他プラットフォームに取り掛かればいい ? Win環境で実装~テストまでほとんど済ませたうえで他OS向け作業に取り掛かれる ? P/Invoke周りの不安はすべて朴鬱だった – DllImportのDLL検索がやたら柔軟 – 呼び出し規約とか – 構造体のアラインメントとか – ネイティブ側に関数ポインタどうやってわたすの?とか ? Xamarin.iOSでは制限は多いが… – どれもどうにかなる手段が用意されていた
  • 24. つらかったところ ? Xcode(InterfaceBuilder)が気難しい – 慣れの問題だとは思うが… ? MacのBinding – オレオレ実装とか正直やりたくないし、やるべきでないと思う – MvvmCrossとか、使えるようになってるといいな – このあたりが整備されてきたら、Xamarinはデスクトップ向けクロスプラット フォーム開発環境として本当に有力な選択肢になりえると思う ? デスクトップアプリ自体もうそんな流行らないかな… ? Xamarin.MacでInvalidProgramExceptionが結構起きる – 深追いしてないが、書き方を変えるときちんと動いたりする ? Xamarin.FormsのXAML≠WPFのXAML – 特にBehaviorのBindingPropertyあたりでハマった