ぴーさんログ

だいたいXamarin.Formsのブログ

【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回だけ呼ぶ、といった使い方にすると良いと思います。