Visual Basic で Xamarin.Forms アプリ開発どこまでいける?

[初心者さん・学生さん大歓迎!] 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 アプリは、どこまで Visual Basic 化できるか?

Not XAML の場合

Xamarin.Forms プロジェクトをテンプレートから作成すると、

  • MyApp
  • MyApp.Droid
  • MyApp.iOS
  • MyApp.UWP

の4つのプロジェクトがいずれも C# で作成されます。 (この内、もともと MS の管轄である UWP は今回のネタからは除外します)

コアとなる MyApp プロジェクトは PCL なので、ここは Visual Basic が使えます。 ちょっとやってみましょう。

xamarinforms with vb 01

xamarinforms with vb 02

こうします。

C# で適当な Xamarin.Forms プロジェクトを作成した後、追加 -> 新しいプロジェクト で、 Visual Basic のポータブルクラスライブラリ を作成します。

xamarinforms with vb 03

なんかプロファイルを聞かれるので、 Xamarin.Android と Xamarin.iOS と UWP あたりを含ませます。

xamarinforms with vb 04

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 の場合)。

xamarinforms with vb 05

ほら VB.NET で Xamarin.Forms 、できました。C# 側の PCL プロジェクトは削除してしまって問題ないです。

XAML の場合

コードで画面を書くのはできましたが、Xamarin.Forms XAML は使えるのでしょうか? 使えなさそう……使えませんでしたー。

C# の Xamarin.Forms XAML や、VB.NET の WPF の XAML プロジェクトを見て、見よう見まねでプロジェクトファイル(.vbproj) を、書いてみましたが、「XAML とコードビハインド」として認識されず…。

xamarinforms with vb 06

Prism.Forms プロジェクトを VB.NET 化してみる

画面を XAML で書きたいとなったら、VB.NET をあきらめるしかありません。 が、コードビハインドに1行も書かないマン&ウーマンだったら、Xamarin.Forms のプロジェクトが C# でも問題ないはず。なぜなら ViewModel や Model のプロジェクトを切り離して、そっちを VB.NET にすれば良いのだから!

試しに Prism.Forms のプロジェクトを VB.NET 化してみましょう。 ここでは @Nuits さんの

を題材にさせてもらいます。

ViewModel、Model を VB.NET 化する

このハンズオンのプロジェクトは、

xamarinforms with vb 07

のようになっているので、ViewModels と Models を VB.NET のプロジェクトに追い出してこう

xamarinforms with vb 08

します。

コード長いんで、 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 プロジェクトに追い出して、こう

xamarinforms with vb 09

できないかなー、とトライしてみたのですが、できませんでした。

理由は、 「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要員も活かせるという意味では、ありかも知れませんね。

とここまで書いて、

と丸かぶりだったことに気づく(しかも 2015年9月の情報)! まあ今でも変わらないよ、ということで。