9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[初心者さん・学生さん大歓迎!] Xamarin その2Advent Calendar 2016

Day 25

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

Last updated at Posted at 2016-12-30

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 さんの

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

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

とここまで書いて、

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

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?