【Note】WPF 実行時に XamlParseException、対象が App.xaml 追加の Resources.resx [WPF]
WPF でリソース ファイル Resources.resx を使用すると、以下のような実行時例外がスローされることがあります。
型 'System.Windows.Markup.XamlParseException' の初回例外が PresentationFramework.dll で発生しました
追加情報:'一致するコンストラクターが型 '<リソース クラス名>' に見つかりません。この型は、引数または FactoryMethod ディレクティブを使用して構築できます。' 行番号 '<行>'、行位置 '<列>'。
使用方法が最小限であると、心当たりがなくて詰んでしまいます。
<Application x:Class="<クラス名>"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:properties="clr-namespace:<プロパティ名前空間>"
StartupUri="<開始画面 xaml>">
<Application.Resources>
<properties:Resources x:Key="resources" />
</Application.Resources>
</Application>
この場合、実行時例外のメッセージから見て、引数なしのコンストラクターが単純に見つかっていないようです。
リソース ファイル Resources.resx.cs の自動生成コードでは、アクセス修飾子が public でも、必ず internal のデフォルト コンストラクターが作成されます。
internal Resources() {
}
ビルドの直前に、これを手で public に書き換えてしまいましょう。
public Resources() {
}
こうすると、実行時例外がスローされなくなります。
なお、このコンストラクターは、リソース デザイナーで Resources.resx を保存(書き換えではない)すると、自動的に修飾子が internal に戻ります。
一旦 public で実行できるようになったプロジェクトは、以後 internal に戻っても、クリーンしない限り冒頭の実行時例外を回避することができます(リビルドでも大丈夫)。
プロジェクトをクリーンしてしまったら、上記の手順でもう一度コンストラクターを一時的に public に書き換えてビルドし、改めて internal に戻しておきます。
現象から見て、リソース ファイルのソースコード自動生成部と、XAML パース部との間で、リソース クラスのコンストラクター修飾子に関連する不整合があるような気がします。
いずれ詳しく追跡して、例外をスローする原因を含む中途生成ファイルの特定と、こうなってしまう根本的な原因を解明してみようと思います。