読者です 読者をやめる 読者になる 読者になる

気まま研究所ブログ

思ったことをてきとーに書きます。

Xamarin Forms iOSだけでなぜかxmlnsが見つからないエラーが出る

f:id:AonaSuzutsuki:20170328191704p:plain

こんにちは。
最近Xamarin Formsを触る機会があり、そこで謎のエラーで詰んだので備忘録的に残しておきます。
おそらく今回触れるライブラリ以外でもすべての外部ライブラリで出ると思います。

ことの発端

GUIを作るためにnugetでライブラリをインストールし、iOSで動かしたところなぜか以下のような指定されたクラスが見つからないとかいうエラーが出ました。

Unhandled Exception:
Xamarin.Forms.Xaml.XamlParseException: Position 50:10. Type controls:ImageButton not found in xmlns clr-namespace:XLabs.Forms.Controls;assembly=XLabs.Forms

その時のコードが以下のようなものになります。

今回はXLabs.FormsのImageButtonを使おうと思っていた時なんですが、Androidは普通に動くのにiOSだけなぜか動かない。
参照やらは問題なし、for Macで確認するも同じエラーが出る。
どうやらXamarin Forms iOSの問題らしい。

テスト環境

  1. Windows 10 Pro x64
  2. Visual Studio 2017

とりあえず治った

いろいろ試行錯誤してみたところ、とりあえず治りました。
xamlや、参照設定自体には何も問題がありませんでしたが、お作法的に以下のようなことをしないとだめみたいです。

  1. コードビハインドにusingで名前空間を指定する
  2. なんでもいいからその名前空間(ライブラリが同じなら1個でいい?)のクラスを使う

具体的には以下のようにusingに使いたいライブラリの名前空間を突っ込んでどこでもいいからその中のクラスを使う。
以下ではInitializeComponentの前にやってるけど、本当にどこでもいい。

ちなみに、newしないでnullにすると警告が出てかなりうざいです。

結局のところ原因は?

お作法的にと上述のことをしましたが、実はこれをしないとiOSのほうでは参照に追加されないんです
以下はILSpyにて逆コンパイルした結果ですが、Androidはお作法をしようがしまいが参照に追加されています。
f:id:AonaSuzutsuki:20170328190724p:plain
しかし、iOSではお作法をしないと以下のように参照に追加されません。
f:id:AonaSuzutsuki:20170328190739p:plain
お作法をすると追加されます。
f:id:AonaSuzutsuki:20170328190925p:plain
これがクラスが見つからないと言われる原因です。

おわりに

5時間ほどかけて原因を探りましたが、なんとか判明して良かったです。
とは言え、なんでこんなことをしないとけない仕様になってるんでしょうか。 いらないコードを書かないといけないのでめんどくさい上にメンテナンス性落ちますよ。
なんとかならないんですかね・・・。

追記①

しばらくして確認してみると直っていました。