古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

UWP で XamlReader.Load すると例外で死ぬ罠とその解決策について

割と罠だったので記事書きました


以前このブログでも紹介した拙作「Mikaboshi (みかぼし)」では、リソースとして都道府県道・国道・高速道路の標識データを XAML ファイルで保持しています。
ayano.hateblo.jp

f:id:ChiiAyano:20170802230852p:plain
赤く囲ったものがそれです。

今もちょくちょく更新していますが、最近何らかのタイミングでデバッグ実行で位置情報テストしていると、AccessViolationException の例外が発生してしまうようになりました。
それが上記の XAML ファイルを読むときに使用している System.Windows.Markup.XamlReader.Load メソッドでした。
XamlReader クラス (System.Windows.Markup)
ちなみにこのメソッドは、string として保持している XAML のデータをパースして、オブジェクトとしてインスタンス生成するというものです。割と便利。


例外が発生するコードの最小構成はこんな感じ。これだけでも例外が発生します。
gist.github.com
f:id:ChiiAyano:20170802232356p:plain


このコードに含まれる string で持っている XAML のデータ、xmlns 名前空間エイリアスをつけていますが、これが悪さしているのかなあと思って消したところ、見事に例外が出なくなりました
つまりこういうことです
gist.github.com


なんでこうなるのか、これまでこれで OK だったのに、なぜ今になってダメになったのか、ちょっと解明できてないですが、
なんとなく思うのは、既に親になる MainPage.xaml には同じ xmlns 名前空間が宣言されていて、エイリアスをつけて重複状態になるのでダメで、それが今になって厳密化された…のかなあと雑に考えています。
誰かわかる人いたら教えて下さい…。