SSブログ

【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 パース部との間で、リソース クラスのコンストラクター修飾子に関連する不整合があるような気がします。 

いずれ詳しく追跡して、例外をスローする原因を含む中途生成ファイルの特定と、こうなってしまう根本的な原因を解明してみようと思います。 


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。