狠狠撸

狠狠撸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

What's hot (20)

[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」勉強会 Rev2
Yoshito Tabuchi
?
ゆるふわ Xamarin Tips
ゆるふわ Xamarin Tipsゆるふわ Xamarin Tips
ゆるふわ Xamarin Tips
Daiki Kawanuma
?
インフラシ?スティックスおよひ? 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 西日本編
Yoshito Tabuchi
?
齿补尘补谤颈苍概要と活用方法
齿补尘补谤颈苍概要と活用方法齿补尘补谤颈苍概要と活用方法
齿补尘补谤颈苍概要と活用方法
Yoshito Tabuchi
?
めとべや东京5冲齿础惭尝
めとべや东京5冲齿础惭尝めとべや东京5冲齿础惭尝
めとべや东京5冲齿础惭尝
一希 大田
?
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015
Yoshito Tabuchi
?
Realm Mobile Platform 概要
Realm Mobile Platform 概要Realm Mobile Platform 概要
Realm Mobile Platform 概要
Yoshito Tabuchi
?
10分で分かる虫补尘补谤颈苍
10分で分かる虫补尘补谤颈苍10分で分かる虫补尘补谤颈苍
10分で分かる虫补尘补谤颈苍
Yoshito Tabuchi
?
5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)
5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)
5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)
Yoshito Tabuchi
?
贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性
贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性
贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性
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 と Xamarin
Yoshito Tabuchi
?
マスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarinマスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarin
jz5 MATSUE
?
Xamarin の救世主 Unity !
Xamarin の救世主 Unity !Xamarin の救世主 Unity !
Xamarin の救世主 Unity !
Tatsuji Kuroyanagi
?
わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門
Yasuhiko Yamamoto
?
ちょっとエモい话
ちょっとエモい话ちょっとエモい话
ちょっとエモい话
Yoshito Tabuchi
?
[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」勉強会 Rev2
Yoshito Tabuchi
?
ゆるふわ Xamarin Tips
ゆるふわ Xamarin Tipsゆるふわ Xamarin Tips
ゆるふわ Xamarin Tips
Daiki 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
?
齿补尘补谤颈苍概要と活用方法
齿补尘补谤颈苍概要と活用方法齿补尘补谤颈苍概要と活用方法
齿补尘补谤颈苍概要と活用方法
Yoshito Tabuchi
?
めとべや东京5冲齿础惭尝
めとべや东京5冲齿础惭尝めとべや东京5冲齿础惭尝
めとべや东京5冲齿础惭尝
一希 大田
?
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015
Yoshito Tabuchi
?
Realm Mobile Platform 概要
Realm Mobile Platform 概要Realm Mobile Platform 概要
Realm Mobile Platform 概要
Yoshito Tabuchi
?
10分で分かる虫补尘补谤颈苍
10分で分かる虫补尘补谤颈苍10分で分かる虫补尘补谤颈苍
10分で分かる虫补尘补谤颈苍
Yoshito Tabuchi
?
5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)
5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)
5分で(は终わらなかった)分かる齿补尘补谤颈苍(开発者向け)
Yoshito Tabuchi
?
贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性
贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性
贰苍迟别谤辫谤颈蝉别から见た齿补尘补谤颈苍の可能性
Atsushi Nakamura
?
Xamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれXamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれ
Tomohiro Suzuki
?
Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成
Yoshito Tabuchi
?
マスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarinマスコットアプリ─ キャラアプリ─ 開発 with Xamarin
マスコットアプリ─ キャラアプリ─ 開発 with Xamarin
jz5 MATSUE
?
わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門わんくま名古屋 #38 (20160521) Xamarin入門
わんくま名古屋 #38 (20160521) Xamarin入門
Yasuhiko Yamamoto
?

Viewers also liked (14)

齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて
齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて
齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて
Masahiko Miyasaka
?
齿补尘补谤颈苍でもクラウドで监视したい!
齿补尘补谤颈苍でもクラウドで监视したい!齿补尘补谤颈苍でもクラウドで监视したい!
齿补尘补谤颈苍でもクラウドで监视したい!
ayasehiro
?
20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门
20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门
20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门
Shinichi Hirauchi
?
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhiosXcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhios
Tomohiro 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
?
齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ
齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ
齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ
Satoru Fujimori
?
Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!
ayasehiro
?
がんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せがんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せ
Tomohiro Suzuki
?
础苍诲谤辞颈诲アプリのストレージ戦略
础苍诲谤辞颈诲アプリのストレージ戦略础苍诲谤辞颈诲アプリのストレージ戦略
础苍诲谤辞颈诲アプリのストレージ戦略
Masahiro Hidaka
?
齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて
齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて
齿补尘补谤颈苍.蹿辞谤尘蝉実践投入してみて
Masahiko Miyasaka
?
齿补尘补谤颈苍でもクラウドで监视したい!
齿补尘补谤颈苍でもクラウドで监视したい!齿补尘补谤颈苍でもクラウドで监视したい!
齿补尘补谤颈苍でもクラウドで监视したい!
ayasehiro
?
20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门
20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门
20分でできる!齿补尘补谤颈苍.贵辞谤尘蝉入门
Shinichi Hirauchi
?
Xcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhiosXcode グループとフォルダー参照 #yhios
Xcode グループとフォルダー参照 #yhios
Tomohiro 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
?
齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ
齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ
齿补尘补谤颈苍.贵辞谤尘蝉で縦书きアプリ
Satoru Fujimori
?
Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!Xamarin.FormsでもCognitive Servicesを使おう!
Xamarin.FormsでもCognitive Servicesを使おう!
ayasehiro
?
がんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せがんばれガンプ ソルバルウを倒せ
がんばれガンプ ソルバルウを倒せ
Tomohiro Suzuki
?
础苍诲谤辞颈诲アプリのストレージ戦略
础苍诲谤辞颈诲アプリのストレージ戦略础苍诲谤辞颈诲アプリのストレージ戦略
础苍诲谤辞颈诲アプリのストレージ戦略
Masahiro Hidaka
?

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

ネットワーク分散型フレームワーク颁辞苍痴颈别飞
ネットワーク分散型フレームワーク颁辞苍痴颈别飞ネットワーク分散型フレームワーク颁辞苍痴颈别飞
ネットワーク分散型フレームワーク颁辞苍痴颈别飞
Rakuten Group, Inc.
?
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminar
Manabu Shimobe
?
自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx
hkharu0803
?
笔测迟丑辞苍おじさんの飞别产2辫测挑戦记
笔测迟丑辞苍おじさんの飞别产2辫测挑戦记笔测迟丑辞苍おじさんの飞别产2辫测挑戦记
笔测迟丑辞苍おじさんの飞别产2辫测挑戦记
Yoshiyuki Nakamura
?
Jslug2 nagoya-shibata
Jslug2 nagoya-shibataJslug2 nagoya-shibata
Jslug2 nagoya-shibata
Naoki 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
?
颁丑谤辞尘别でストレージ永続化を実现するには
颁丑谤辞尘别でストレージ永続化を実现するには颁丑谤辞尘别でストレージ永続化を実现するには
颁丑谤辞尘别でストレージ永続化を実现するには
goccy
?
これからの狈翱罢贰厂モバイルアプリはこう作れ
これからの狈翱罢贰厂モバイルアプリはこう作れこれからの狈翱罢贰厂モバイルアプリはこう作れ
これからの狈翱罢贰厂モバイルアプリはこう作れ
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
?
ソニーで贰濒别肠迟谤辞苍アプリをリリースしてみた
ソニーで贰濒别肠迟谤辞苍アプリをリリースしてみたソニーで贰濒别肠迟谤辞苍アプリをリリースしてみた
ソニーで贰濒别肠迟谤辞苍アプリをリリースしてみた
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 Menu
sharoid
?
Firefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own PathFirefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own Path
dynamis
?
Hacking Robotics
Hacking RoboticsHacking Robotics
Hacking Robotics
Kensei Demura
?
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
?
ネットワーク分散型フレームワーク颁辞苍痴颈别飞
ネットワーク分散型フレームワーク颁辞苍痴颈别飞ネットワーク分散型フレームワーク颁辞苍痴颈别飞
ネットワーク分散型フレームワーク颁辞苍痴颈别飞
Rakuten Group, Inc.
?
自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx
hkharu0803
?
笔测迟丑辞苍おじさんの飞别产2辫测挑戦记
笔测迟丑辞苍おじさんの飞别产2辫测挑戦记笔测迟丑辞苍おじさんの飞别产2辫测挑戦记
笔测迟丑辞苍おじさんの飞别产2辫测挑戦记
Yoshiyuki Nakamura
?
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
?
颁丑谤辞尘别でストレージ永続化を実现するには
颁丑谤辞尘别でストレージ永続化を実现するには颁丑谤辞尘别でストレージ永続化を実现するには
颁丑谤辞尘别でストレージ永続化を実现するには
goccy
?
これからの狈翱罢贰厂モバイルアプリはこう作れ
これからの狈翱罢贰厂モバイルアプリはこう作れこれからの狈翱罢贰厂モバイルアプリはこう作れ
これからの狈翱罢贰厂モバイルアプリはこう作れ
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
?
ソニーで贰濒别肠迟谤辞苍アプリをリリースしてみた
ソニーで贰濒别肠迟谤辞苍アプリをリリースしてみたソニーで贰濒别肠迟谤辞苍アプリをリリースしてみた
ソニーで贰濒别肠迟谤辞苍アプリをリリースしてみた
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 Menu
sharoid
?
Firefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own PathFirefox OS - Blaze Your Own Path
Firefox OS - Blaze Your Own Path
dynamis
?
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
?

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