Karakuri.com

Fintechではたらくアプリケーションエンジニアの技術録

XamlParseExceptionがスローされる原因と対処法について

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が出て動かない!としか言われないので、このケースはちょっと大変です…。例外のメッセージやトレースも送ってもらうようにしないとですね。