【Xamarin.Forms】自作ライブラリのカスタムコントロール使用時にSystem.IO.FileNotFoundExceptionが発生する場合の対処
もっと具体的に書くと、
自作ライブラリ(PCL)のコントロールを XAMLのみ で使用していて、 C#コードでそのライブラリを参照しておらず 、Page表示時に System.IO.FileNotFoundException (Could not load file or assembly 'CustomControls' or one of its dependencies. The system cannot find the file specified.) が発生してアプリが落ちる場合の対処方法です。
つまり、こんな風にXAMLしかライブラリを参照していない場合にFileNotFoundExceptionとなります。
<?xml version="1.0" encoding="UTF-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:cc="clr-namespace:CustomControls;assembly=CustomControls" x:Class="XamlAnimationDemo1.MyPage"> <ContentPage.Content> <cc:AwesomeControl /> </ContentPage.Content> </ContentPage>
こういう仕組みです。
(前提) XAMLは実行時に解釈される。
↓
(ビルド時) CustomControls.dllはコード上の何処からも参照されていないため、最終的なアプリパッケージに含まれない。
↓
(結果) 実行時にCustomControls.dllが見つからないため例外発生。
回避策
C#側にライブラリを参照するコードを書いておけばOKです。
public MyPage() { InitializeComponent(); // おまじない new CustomControls.AwesomeControl(); }
もっと文脈的に意味のあるコードにしたければ、ライブラリ側にHogeHoge.Init()
のようなstaticメソッドを用意してエントリポイントで1回だけ呼ぶ、といった使い方にすると良いと思います。