こんにちは。
最近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の問題らしい。
テスト環境
- Windows 10 Pro x64
- Visual Studio 2017
とりあえず治った
いろいろ試行錯誤してみたところ、とりあえず治りました。
xamlや、参照設定自体には何も問題がありませんでしたが、お作法的に以下のようなことをしないとだめみたいです。
具体的には以下のようにusingに使いたいライブラリの名前空間を突っ込んでどこでもいいからその中のクラスを使う。
以下ではInitializeComponentの前にやってるけど、本当にどこでもいい。
ちなみに、newしないでnullにすると警告が出てかなりうざいです。
結局のところ原因は?
お作法的にと上述のことをしましたが、実はこれをしないとiOSのほうでは参照に追加されないんです。
以下はILSpyにて逆コンパイルした結果ですが、Androidはお作法をしようがしまいが参照に追加されています。
しかし、iOSではお作法をしないと以下のように参照に追加されません。
お作法をすると追加されます。
これがクラスが見つからないと言われる原因です。
おわりに
5時間ほどかけて原因を探りましたが、なんとか判明して良かったです。
とは言え、なんでこんなことをしないとけない仕様になってるんでしょうか。 いらないコードを書かないといけないのでめんどくさい上にメンテナンス性落ちますよ。
なんとかならないんですかね・・・。
追記①
しばらくして確認してみると直っていました。
追記②
しばらく様子見してるとどうやらXLabsのライブラリ固有の問題みたいです。