WPFアプリケーションを実行した時に画面がレンダリングされる前にXamlParseExceptionがスローされてクラッシュすることがあります。この例外はデバッカーで原因位置を特定できない場合があり、初めて見たときは絶望と挫折を経験する人もいるかもしれません。僕もWPFアプリケーション開発初期に調べて時間かかった経験があるので、今までのノウハウをメモとして残しておきます。
XamlParseExceptionとは
WPFアプリケーションにおいてXAMLをロードしてパースするときやXAMLのAPIを使用中に何らかのエラーが発生したときにスローされる例外です。
XamlParseException クラス (System.Windows.Markup)
相変わらず奇妙な機械翻訳でMSDNの説明は分かりにくいですが、XamlParseExceptionという名前から先入観でXAMLに問題があると思ってしまいますが、上記のようにXAMLのAPIの使用中のエラーでもスローされるようで、必ずしもXAMLに問題があるわけではありません。というか、多くの場合はそうでないような…。
xaml.csのコンストラクタで例外発生
確かにXamlParseExceptionはデバッカーでブレイクしないことが多いのですが、例外のメッセージやトレースを見れば場所が特定できることがあります。僕の場合はxaml.csのコンストラクタで例外がスローされていました。調べてみるとコンストラクタ内でNullReferenceExceptionが発生していただけというケースだったりします。例えば、List型の変数を初期化せずにAddしていたりとか。
public class View { public View() { InitializeComponent(); DataContext = new ViewModel(); } } public class ViewModel { private List<string> List; public ViewModel() { List.Add("ここで例外発生でXamlParseExceptionとなったり"); } }
不具合報告がXamlParseExceptionだと面倒
また、SDKの提供先からXamlParseExceptionが発生してサンプルコードが動かないと言われたこともあります。そのときはコンストラクタ内でBadImageFormatExceptionがスローされていました。先方が使っているdllのx86とx64を入れ間違って使っていたのです。しかしXamlParseExceptionが出て動かない!としか言われないので、このケースはちょっと大変です…。例外のメッセージやトレースも送ってもらうようにしないとですね。