[初心者さん・学生さん大歓迎!] Xamarin その2 Advent Calendar 2016 25日目です。 Xamarin アプリ開発で使用できる言語は、公式には C# と F# のみですが、初心者にやさしいとされる Visual Basic.NET(VB.NET) を使って Xamarin(今回は Xamarin.Forms)アプリは開発できないのでしょうか?
チャレンジしてみました。
まあだいたい察しがつくので先に結論言っちゃいますけど、VB.NET での Xamarin.Forms アプリ開発は、 「部分的に可能」 です。
部分的に、というのは PCL で作れる箇所で、且つ Xamarin.Forms の XAML 以外です。
PCL は Xamarin でなく .NET 標準のライブラリだから、.NET 系の言語ならなんでも作れるわけですね。
Xamarin.Forms プロジェクトをテンプレートから作成すると、
の4つのプロジェクトがいずれも C# で作成されます。 (この内、もともと MS の管轄である UWP は今回のネタからは除外します)
コアとなる MyApp プロジェクトは PCL なので、ここは Visual Basic が使えます。 ちょっとやってみましょう。
を
こうします。
C# で適当な Xamarin.Forms プロジェクトを作成した後、追加 -> 新しいプロジェクト で、 Visual Basic のポータブルクラスライブラリ を作成します。
なんかプロファイルを聞かれるので、 Xamarin.Android と Xamarin.iOS と UWP あたりを含ませます。
VB.NET の PCL に、nuget パッケージマネージャから「Xamarin.Forms」を追加します。
App.vb
クラスを追加し、以下のように書きます。
Imports Xamarin.Forms
Public Class App
Inherits Application
Private WithEvents _button1 As Button
Sub New()
Dim layout = New StackLayout() With {
.VerticalOptions = LayoutOptions.Center
}
_button1 = New Button() With {
.Text = "Goto Second"
}
layout.Children.Add(New Label() With {
.HorizontalTextAlignment = TextAlignment.Center,
.Text = "Xamarin.Forms with Visual Basic!"
})
layout.Children.Add(_button1)
Dim content = New ContentPage() With {
.Title = "TryXFWithVB",
.Content = layout
}
MainPage = New NavigationPage(content)
End Sub
Private Sub Button1_Clicked(sender As Object, args As EventArgs) Handles _button1.Clicked
''次のページに遷移する処理を書く
End Sub
End Class
最後に、 Droid と iOS プロジェクトが参照するプロジェクトを、C# の PCL プロジェクトから VB.NET の PCL プロジェクトに切り替えます。
で、実行すると、こうなります(iOS の場合)。
ほら VB.NET で Xamarin.Forms 、できました。C# 側の PCL プロジェクトは削除してしまって問題ないです。
コードで画面を書くのはできましたが、Xamarin.Forms XAML は使えるのでしょうか? 使えなさそう……使えませんでしたー。
C# の Xamarin.Forms XAML や、VB.NET の WPF の XAML プロジェクトを見て、見よう見まねでプロジェクトファイル(.vbproj
) を、書いてみましたが、「XAML とコードビハインド」として認識されず…。
画面を XAML で書きたいとなったら、VB.NET をあきらめるしかありません。 が、コードビハインドに1行も書かないマン&ウーマンだったら、Xamarin.Forms のプロジェクトが C# でも問題ないはず。なぜなら ViewModel や Model のプロジェクトを切り離して、そっちを VB.NET にすれば良いのだから!
試しに Prism.Forms のプロジェクトを VB.NET 化してみましょう。 ここでは @Nuits さんの
を題材にさせてもらいます。
このハンズオンのプロジェクトは、
のようになっているので、ViewModels と Models を VB.NET のプロジェクトに追い出してこう
します。
コード長いんで、 github に上げました。
BatteryPageViewModel.vb
とか見ると分かるんですけど、 Xamarin.Forms の MVVM も、Prism.Forms も、ちゃんと VB.NET でも動くんですよ(あたりまえだけど)
Prism.Forms で、View とは別アセンブリにある ViewModel を AutoWireViewModel
で見つかるようにするために、同じく @Nuits さんの、
を 適用してます 。
これで、ViewModel とビジネスロジックは VB.NET で記述することができるようになりました。
どうせなら、TextSpeaker.Droid/iOS で C# で行っている「ITextSpeaker の実装」も、VB.NET プロジェクトに追い出して、こう
できないかなー、とトライしてみたのですが、できませんでした。
理由は、 「Xamarin.iOS/Android をサポートするクラスライブラリを VB.NET で作成できない事」です。Xamarin.iOS/Android はともに Monoランタイムを基盤としますが、これを基盤とする VB.NET のクラスライブラリを作成することができませんでした(少なくとも Visual Studio 2015 では)。
この辺を見ると vbnc
ってコンパイラでできそう?いや Xamarin.Android/iOS はそれに対応してないからダメ?とかよくわかりません。
初心者向けの Visual Basic を使うのにトリッキーなことをするのも本末転倒なので深掘りは辞めておきます。
というわけでまとめ。
Visual Basic を使って Xamarin.Forms アプリの開発は、
は可能です(特に後者を "Xamarin の" と呼んでよいかはお任せします)。
逆に Visual Basic では不可能なのは、
です。
CustomRenderer、Effects などプラットフォーム固有の処理は C#/F# で書くしかありません。
Visual Basic エンジニアと分業するなら、彼らはモバイル系のAPIに関与できないので、逆に分かりやすいかも知れません。
半分ネタのつもりだったけど、VB要員も活かせるという意味では、ありかも知れませんね。
とここまで書いて、
と丸かぶりだったことに気づく(しかも 2015年9月の情報)! まあ今でも変わらないよ、ということで。