Xamarin.Android で実行するエミュレーターを選択できない

 Visual Studio 2017Xamarin.AndroidF# プロジェクトを作成すると、デバッグ実行するエミュレーターを選択できないことがあります。
 というか私の環境では 100% 選択できないタイミングがあります。
 

■ 再現手順

 Visual StudioF#Xamarin.Android プロジェクトを新規作成します。
 

■ 現象

 デバッグの実行ターゲットが「 |> Start 」しか選択肢が現れず、エミュレーターを選択できません。
 
 その場合に、Start を選択しても、デバッグ実行は可能です。ただし、エミュレーターは選択できないので何らかの順序で決まったエミュレーターで実行されます。
 私の環境では、Google Android エミュレーターVisual Studio エミュレーター for Android がインストール/設定されているのですが、Google Android エミュレーターで実行されました。

 ※上記2種のエミュレーターの動作環境は排他です。私の環境は Visual Studio エミュレーター が動く環境です。そのため実際には Google Android エミュレーターを実行しようとして失敗します。
 

■ 対策

 一度、ソリューションを閉じて開きなおします。
 それで、実行ターゲットの選択肢が正常に表示されます。
 

■ おすすめ設定

 F# + Xamarin.Android をやるなら Visual Studio はいったん置いておいて、Xamarin Studio で開発するとはかどりそうです。

Xamarin.Android プロジェクトがエラーが表示され Visual Studio で開けない

 Visual Studio 2017 で F# の Android プロジェクトが、次のエラーが出て開けませんでした。

Project Target Framework Not Installed

または

プロジェクトのターゲット フレームワークがインストールされていません

メッセージの本文には、

このコンピューターにインストールされていない “MonoAndroid,Version=v7.1” を対象にしています。

とあります。
 これは、F# でコンパイルが Android バージョン 7.1 だと発生するようです。(C# では問題ありません)
 

■ 回避方法

 プロジェクトの新規作成後、次の設定を行えば回避できます。

プロジェクトのプロパティ > アプリケーション タブ > Android バージョンを使用したコンパイル:(ターゲット フレームワーク)
で「最新のプラットフォームを使用します(Android 7.1(Nougat))」となっているところを「Android 6.0 (Marshmallow)」などを選択します。
 

■ 既に開かなくなってしまった場合

 上記のエラーを既に発生させてしまっている場合、設定が既に Android 7.1 を使うようになってしまっています。
 この場合、該当プロジェクトの .fsproj ファイルを直接編集して設定を変更します。
 
・AndroidUseLatestPlatformSdk を true に変更
・TargetFrameworkVersion を v6.0 などに変更
 

■ 変更前

<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v7.1</TargetFrameworkVersion>

 

■ 変更後

<AndroidUseLatestPlatformSdk>False</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v6.0</TargetFrameworkVersion>

 
※Xamarin Studio だと全く問題ない上にプロジェクトのテンプレートも(F# のもの)充実しているので、Visual Studio を捨てて Xamarin Studio で生きるのが一番の解決策かもしれません。

F# で HelloWorld してみた(Xamarin.Forms)

 F#Xamarin.Forms でHelloWorld 的なコードを書いてみました。
 構成としては、
F#PCL
C#PCL
・.Droid プロジェクト
・.iOS プロジェクト
の 4 プロジェクト構成になっています。
 

■ 概要

 C# による PCL 構成のソリューションをベースにしています。
 テンプレートで C# プロジェクトに作成される App.csMainPage.csF# プロジェクト内のクラスで継承し、.Droid や .iOS プロジェクトからはこれら F# のクラスを使用しています。
 更に、F# プロジェクトで ViewModel クラスを宣言しています。
 これにより、XAMLC# プロジェクト内にいますが、ロジック部分は F# で記述できる Xamarin.Forms ソリューションができたと思います。
 

■ C# PCL が要る理由

 F# では、一つのクラスを XAML とコードに分割して宣言することができない様です。
 そのため、XAMLC# のプロジェクトに置くことにしました。
 

■ 書いてみたコード

[ github] FSharpHelloXamarinForms

[Xamarin.Forms] x:FieldModifier が使えない?

 WPF の xaml で コントロールのアクセス修飾子を指定する場合、 x:FieldModifier 属性を使用しました。

■ 例(WPF の場合)

 次の例は、 label をいう名前の Label のアクセス修飾子を protected にしています。

<Label x:Name="label" x:FieldModifier="protected"/> 

 

■ Xamarin.Forms の場合

 x:FieldModifie を記述してもエラーにはなりませんが、残念なことにアクセス修飾子は変化しません。
 

■ 対処法(A プラン)

 NameScopeExtensionsT FindByName(this Element element, string name) 拡張メソッドを使用する。

this.FindByName<Label>("label");

 上記コードで、サブクラスなどでコントロールを取得できます。 ただし、文字列でコントロールを指定しているため、コントロール名のリファクタリング時に壊れる危険があります。
 

■ 対処法(B プラン)

 サブクラスなどで取得したいコントロールをプロパティで公開する。

public Label Label { get { return this.label; } }

 文字列による指定でないため、リファクタリングで壊れる心配はありません。ただし、いちいちプロパティを作成しなくてはならずコード量が増えてしまいます。
 好きなプランを実行すれば良いですが、どちらかと言えばリファクタリングで壊れにくい B プランがお勧めです。

Visual Studio Emulator for Android が動かない場合

 Visual Studio Emulator for Android を使おうとした場合に、次のメッセージが表示されて動作しない場合があります。

エミュレーターを起動できません
ハイパーバイザーが実行されていないため、Windows Phone エミュレーターを起動できません。ハードウェア対応仮想化が有効になっていないことが原因の可能性があります。
コンピューターの BIOS を調べ、ハードウェア対応仮想化およびハードウェア対応データ実行保護機能が有効になっていることを確認してください。

 Windows Phone エミュレーター という言葉に「?」となるかもしれませんが、Hyper-V が有効になっていない可能性があります。
 特に、これまで Google Android エミュレーター を使っていた場合は、off になっているはずなので、再現すると思います。

■ Hyper-V を有効にする

 Hyper-V を有効にするには次のコマンドを管理者として実行します。

bcdedit /set hypervisorlaunchtype auto

 実行後、PC を再起動します。

 次のサイトを参考にしました。

[参考 http://blog.okazuki.jp/entry/2014/04/07/100738]

Visual Studio Emulator for Android をインストールする

 Visual Studio では Android アプリをデバッグする際に使える Android エミュレーターとして
Google Android エミュレーター
Visual Studio Emulator for Android
が用意されています。

 前者は、Hyper-V が off でなければ、後者は Hyper-V が on でなければ動作しないため、排他での使用になります。
 かつて、Visual Studio Emulator for Android は動作が遅く、前者を使用していました。
 しかし、今は改善され快適になりました。実際とても速いです。

■ インストール

 インストーラで .NET によるモバイル開発 を選択すると、画面右の[概要]の[省略可能]に Google Android エミュレーター のチェックが現れますが、Visual Studio Emulator for Android のチェックは現れません。
 Visual Studio Emulator for Android は [個別のコンポーネント] タブの [エミュレーター] の中にチェックがあります。

■ インストール サイズ

 チェックを付けた際の インストール サイズ の増加は 463 MB でした。
 Google Android エミュレーター は 17.58 GB ですから、インストール サイズ の節約にもいいかもしれません。

[Xamarin] https 通信でエラーが出ることがある

Xamarin で https 通信で次のエラーが出ることがあります。
TrustFailure (The authentication or decryption has failed.)

次のような理由ということで、本当はエラーで正しいことのようです。
回避方法も次のサイトにあります。

SSL通信で信頼されない証明書を回避するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/867sslavoidverify/sslavoidverify.html

ただし、Xamarin で使うときは PCL ではなく各プラットフォームの中で記述する必要があるようです。

Ignore SSL certificate errors in Xamarin.Forms (PCL) – Stack Overflow
http://stackoverflow.com/questions/28629989/ignore-ssl-certificate-errors-in-xamarin-forms-pcl

これでつながるようになりますが、
リリース時のコードには含まない様、気を付けましょう。