SlideShare a Scribd company logo
1 of 25
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

What's hot

[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~
[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~
[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~de:code 2017
 
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介Yoshito Tabuchi
 
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2Yoshito Tabuchi
 
ゆるふわ Xamarin Tips
ゆるふわ Xamarin Tipsゆるふわ Xamarin Tips
ゆるふわ Xamarin TipsDaiki Kawanuma
 
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編Yoshito Tabuchi
 
Xamarin概要と活用方法
Xamarin概要と活用方法Xamarin概要と活用方法
Xamarin概要と活用方法Yoshito Tabuchi
 
めとべや東京5_XAML
めとべや東京5_XAMLめとべや東京5_XAML
めとべや東京5_XAML一希 大田
 
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Yoshito Tabuchi
 
Realm Mobile Platform 概要
Realm Mobile Platform 概要Realm Mobile Platform 概要
Realm Mobile Platform 概要Yoshito Tabuchi
 
10分で分かるxamarin
10分で分かるxamarin10分で分かるxamarin
10分で分かるxamarinYoshito Tabuchi
 
5分で(は終わらなかった)分かるXamarin(開発者向け)
5分で(は終わらなかった)分かるXamarin(開発者向け)5分で(は終わらなかった)分かるXamarin(開発者向け)
5分で(は終わらなかった)分かるXamarin(開発者向け)Yoshito Tabuchi
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Atsushi Nakamura
 
Xamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれXamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれTomohiro Suzuki
 
Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Yoshito Tabuchi
 
NET Standard と Xamarin
NET Standard と XamarinNET Standard と Xamarin
NET Standard と XamarinYoshito Tabuchi
 
マスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarinマスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarinjz5 MATSUE
 
わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門Yasuhiko Yamamoto
 
ちょっとエモい話
ちょっとエモい話ちょっとエモい話
ちょっとエモい話Yoshito Tabuchi
 

What's hot (20)

[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~
[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~
[MW08] de:code イベントアプリの作り方 ~ Xamarin.Forms で開発しています ~
 
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介
 
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2
Xamarin 概要 @ 「Xamarin」って何? Wエバンジェリストによる特濃「Xamarin」勉強会 Rev2
 
ゆるふわ Xamarin Tips
ゆるふわ Xamarin Tipsゆるふわ Xamarin Tips
ゆるふわ Xamarin Tips
 
インフラジスティックスおよび Xamarin.Forms コントロールのご紹介
インフラジスティックスおよび Xamarin.Forms コントロールのご紹介インフラジスティックスおよび Xamarin.Forms コントロールのご紹介
インフラジスティックスおよび Xamarin.Forms コントロールのご紹介
 
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
Xamarin 概要 @ 2014/11/08 第2回 Japan Xamarin User Group Conference 西日本編
 
Xamarin概要と活用方法
Xamarin概要と活用方法Xamarin概要と活用方法
Xamarin概要と活用方法
 
めとべや東京5_XAML
めとべや東京5_XAMLめとべや東京5_XAML
めとべや東京5_XAML
 
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015
 
Realm Mobile Platform 概要
Realm Mobile Platform 概要Realm Mobile Platform 概要
Realm Mobile Platform 概要
 
10分で分かるxamarin
10分で分かるxamarin10分で分かるxamarin
10分で分かるxamarin
 
5分で(は終わらなかった)分かるXamarin(開発者向け)
5分で(は終わらなかった)分かるXamarin(開発者向け)5分で(は終わらなかった)分かるXamarin(開発者向け)
5分で(は終わらなかった)分かるXamarin(開発者向け)
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性
 
Xamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれXamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれ
 
Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成
 
NET Standard と Xamarin
NET Standard と XamarinNET Standard と Xamarin
NET Standard と Xamarin
 
マスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarinマスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarin
 
Xamarin の救世主 Unity !
Xamarin の救世主 Unity !Xamarin の救世主 Unity !
Xamarin の救世主 Unity !
 
わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門
 
ちょっとエモい話
ちょっとエモい話ちょっとエモい話
ちょっとエモい話
 

Viewers also liked

Xamarin.forms実践投入してみて
Xamarin.forms実践投入してみてXamarin.forms実践投入してみて
Xamarin.forms実践投入してみてMasahiko Miyasaka
 
Xamarinでもクラウドで監視したい!
Xamarinでもクラウドで監視したい!Xamarinでもクラウドで監視したい!
Xamarinでもクラウドで監視したい!ayasehiro
 
20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門Shinichi Hirauchi
 
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhiosXcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhiosTomohiro Kumagai
 
C++ と Visual Studio による Android 開発
C++ と Visual Studio による Android 開発C++ と Visual Studio による Android 開発
C++ と Visual Studio による Android 開発友太 渡辺
 
Xamarin 101 ~環境構築からビルド・テストまで~
Xamarin 101 ~環境構築からビルド・テストまで~Xamarin 101 ~環境構築からビルド・テストまで~
Xamarin 101 ~環境構築からビルド・テストまで~Masaki Takeda
 
XunitとMoq 公開用
XunitとMoq 公開用XunitとMoq 公開用
XunitとMoq 公開用ESM SEC
 
2016.10.15アプリ発表会
2016.10.15アプリ発表会2016.10.15アプリ発表会
2016.10.15アプリ発表会b a
 
Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~
Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~
Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~Daiki Kawanuma
 
証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみた証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみたMasahiko Miyasaka
 
Xamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリXamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリSatoru Fujimori
 
Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!ayasehiro
 
がんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せがんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せTomohiro Suzuki
 
Androidアプリのストレージ戦略
Androidアプリのストレージ戦略Androidアプリのストレージ戦略
Androidアプリのストレージ戦略Masahiro Hidaka
 

Viewers also liked (14)

Xamarin.forms実践投入してみて
Xamarin.forms実践投入してみてXamarin.forms実践投入してみて
Xamarin.forms実践投入してみて
 
Xamarinでもクラウドで監視したい!
Xamarinでもクラウドで監視したい!Xamarinでもクラウドで監視したい!
Xamarinでもクラウドで監視したい!
 
20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門
 
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhiosXcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhios
 
C++ と Visual Studio による Android 開発
C++ と Visual Studio による Android 開発C++ と Visual Studio による Android 開発
C++ と Visual Studio による Android 開発
 
Xamarin 101 ~環境構築からビルド・テストまで~
Xamarin 101 ~環境構築からビルド・テストまで~Xamarin 101 ~環境構築からビルド・テストまで~
Xamarin 101 ~環境構築からビルド・テストまで~
 
XunitとMoq 公開用
XunitとMoq 公開用XunitとMoq 公開用
XunitとMoq 公開用
 
2016.10.15アプリ発表会
2016.10.15アプリ発表会2016.10.15アプリ発表会
2016.10.15アプリ発表会
 
Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~
Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~
Xamarin 初心者の勘所~Twitter 検索アプリを作った感想~
 
証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみた証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみた
 
Xamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリXamarin.Formsで縦書きアプリ
Xamarin.Formsで縦書きアプリ
 
Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!
 
がんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せがんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せ
 
Androidアプリのストレージ戦略
Androidアプリのストレージ戦略Androidアプリのストレージ戦略
Androidアプリのストレージ戦略
 

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

ネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewRakuten Group, Inc.
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminarManabu Shimobe
 
自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptxhkharu0803
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Yoshiyuki Nakamura
 
Jslug2 nagoya-shibata
Jslug2 nagoya-shibataJslug2 nagoya-shibata
Jslug2 nagoya-shibataNaoki Shibata
 
Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用
Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用
Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用Preferred Networks
 
Cedec2015 ゲームサーバー基盤の新しい選択肢
Cedec2015 ゲームサーバー基盤の新しい選択肢Cedec2015 ゲームサーバー基盤の新しい選択肢
Cedec2015 ゲームサーバー基盤の新しい選択肢Maho Takara
 
Chromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するにはChromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するにはgoccy
 
これからのNOTESモバイルアプリはこう作れ
これからのNOTESモバイルアプリはこう作れこれからのNOTESモバイルアプリはこう作れ
これからのNOTESモバイルアプリはこう作れMitsuru Katoh
 
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~Saki Homma
 
第4回 SoftLayer勉強会 資料
第4回 SoftLayer勉強会 資料第4回 SoftLayer勉強会 資料
第4回 SoftLayer勉強会 資料Naoki Shibata
 
ソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみたソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみたYasuharu Seki
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Yoshito Tabuchi
 
SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例
SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例
SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例SORACOM,INC
 
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッション
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッションC# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッション
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッションYoshito Tabuchi
 
Sharoid Service Menu
Sharoid Service MenuSharoid Service Menu
Sharoid Service Menusharoid
 
Firefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own PathFirefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own Pathdynamis
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#Yuta Matsumura
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割Toru Yamaguchi
 

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

ネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConView
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminar
 
自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
 
Jslug2 nagoya-shibata
Jslug2 nagoya-shibataJslug2 nagoya-shibata
Jslug2 nagoya-shibata
 
Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用
Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用
Cloud operator days tokyo 2020講演資料_少人数チームでの機械学習製品の効率的な開発と運用
 
Cedec2015 ゲームサーバー基盤の新しい選択肢
Cedec2015 ゲームサーバー基盤の新しい選択肢Cedec2015 ゲームサーバー基盤の新しい選択肢
Cedec2015 ゲームサーバー基盤の新しい選択肢
 
Chromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するにはChromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するには
 
これからのNOTESモバイルアプリはこう作れ
これからのNOTESモバイルアプリはこう作れこれからのNOTESモバイルアプリはこう作れ
これからのNOTESモバイルアプリはこう作れ
 
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
 
第4回 SoftLayer勉強会 資料
第4回 SoftLayer勉強会 資料第4回 SoftLayer勉強会 資料
第4回 SoftLayer勉強会 資料
 
ソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみたソニーでElectronアプリをリリースしてみた
ソニーでElectronアプリをリリースしてみた
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版
 
SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例
SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例
SORACOM Discovery2019 H1新規事業立上げを支援するソラコムチームの活動とユーザー事例
 
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッション
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッションC# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッション
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッション
 
Sharoid Service Menu
Sharoid Service MenuSharoid Service Menu
Sharoid Service Menu
 
Firefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own PathFirefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own Path
 
Hacking Robotics
Hacking RoboticsHacking Robotics
Hacking Robotics
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 

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あたりでハマった