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 アプリは、どこまで Visual Basic 化できるか?
Not XAML の場合
Xamarin.Forms プロジェクトをテンプレートから作成すると、
- MyApp
- MyApp.Droid
- MyApp.iOS
- MyApp.UWP
の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 プロジェクトは削除してしまって問題ないです。
XAML の場合
コードで画面を書くのはできましたが、Xamarin.Forms XAML は使えるのでしょうか?
使えなさそう……使えませんでしたー。
C# の Xamarin.Forms XAML や、VB.NET の WPF の XAML プロジェクトを見て、見よう見まねでプロジェクトファイル(.vbproj
) を、書いてみましたが、「XAML とコードビハインド」として認識されず…。
Prism.Forms プロジェクトを VB.NET 化してみる
画面を XAML で書きたいとなったら、VB.NET をあきらめるしかありません。
が、コードビハインドに1行も書かないマン&ウーマンだったら、Xamarin.Forms のプロジェクトが C# でも問題ないはず。なぜなら ViewModel や Model のプロジェクトを切り離して、そっちを VB.NET にすれば良いのだから!
試しに Prism.Forms のプロジェクトを VB.NET 化してみましょう。
ここでは @Nuits さんの
- PrismAndMoqHansOn/01.HandsOn-Overview.md at master · jxug/PrismAndMoqHansOn
- Prism and Moqハンズオンのドキュメントを大幅に加筆修正しました - nuits.jp blog
を題材にさせてもらいます。
ViewModel、Model を VB.NET 化する
このハンズオンのプロジェクトは、
のようになっているので、ViewModels と Models を VB.NET のプロジェクトに追い出してこう
します。
コード長いんで、 github に上げました。
BatteryPageViewModel.vb
とか見ると分かるんですけど、 Xamarin.Forms の MVVM も、Prism.Forms も、ちゃんと VB.NET でも動くんですよ(あたりまえだけど)
Prism.Forms で、View とは別アセンブリにある ViewModel を AutoWireViewModel
で見つかるようにするために、同じく @Nuits さんの、
を 適用してます 。
これで、ViewModel とビジネスロジックは VB.NET で記述することができるようになりました。
プラットフォーム固有の処理を 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 アプリの開発は、
- XAML を使わない Xamarin.Forms アプリ開発
- ViewModel とビジネスロジック
は可能です(特に後者を "Xamarin の" と呼んでよいかはお任せします)。
逆に Visual Basic では不可能なのは、
- Xamarin.Forms の XAML の使用
- Xamarin.Android, Xamarin.iOS の使用
です。
CustomRenderer、Effects などプラットフォーム固有の処理は C#/F# で書くしかありません。
Visual Basic エンジニアと分業するなら、彼らはモバイル系のAPIに関与できないので、逆に分かりやすいかも知れません。
半分ネタのつもりだったけど、VB要員も活かせるという意味では、ありかも知れませんね。
とここまで書いて、
- Xamarin.Forms using Visual Basic.NET - Xamarin
- 【朗報?】Visual Basic ユーザーも Xamarin.Forms でモバイル開発者になれます! - Xamarin 日本語情報
と丸かぶりだったことに気づく(しかも 2015年9月の情報)!
まあ今でも変わらないよ、ということで。