0

前の質問で述べたように、プログラムの存続期間中に変更されない文字列リソースのセットがありますが、文字列のリストに対する高価な操作によってのみ取得できます。

public static class Patterns
{       
    Public static readonly string StateUS =
        @"\b(?<STATE>" + CharTree.GenerateRegex(FixedLists.StateUS) + @")\b";

    Public static readonly string Countries =
        @"\b(?<STATE>" + CharTree.GenerateRegex(FixedLists.Countries) + @")\b";

    //.....
}

パフォーマンスを改善するために、ファイルからリストを読み取り、リソース ファイルを出力する T4 で目的の文字列を生成しましたRegex.restext

StatesUS=A(LA(SK|BAM)A|RKANSAS)|B.....
Countries=UNITED (STATES|KINGDOM)|CA(NAD|MBODI)A.....

このファイルは、ビルド後にターゲット ディレクトリにコピーされてコンパイルされます。

cd $(ProjectDir)
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\resgen.exe" /compile Regex.restext
copy /Y Regex.resources "$(TargetDir)MyProject.Resources.Lists.resources"

しかし、静的コンストラクター内でこれらの値をロードしようとすると、次のようになりますPatterns

ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("MyProject.Resources.Lists", @".\", null);
StateUS = rm.GetString("StateUS")

次のエラーが表示されます。

InnerException: System.Resources.MissingManifestResourceException
Message=Could not find any resources appropriate for the specified culture (or the neutral culture) on disk.
System.Resources.FileBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark)
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)

しかし、これはカルチャーに依存しないプロジェクトです。リソースは単なる保管用です。では、なぜカルチャを指定する必要があるのでしょうか。どのように/どこでそうしますか?

また、リソースをロードするために間違ったアプローチを取っている場合、より良い方法は何でしょうか?

4

1 に答える 1

1

この例外は、MyProject.Resources.Lists.resources ファイルが見つからなかったことを示しています。ファイルへのパスまたはファイル名自体が間違っている可能性があります。サンプル アプリを作成してサンプルを検証しましたが、問題なく動作します。

リソース ファイルに正しい場所を使用していることを確認するには、@".\"をに置き換える必要があります。アプリケーション内の任意の場所にPath.GetDirectoryName(Assembly.GetExecutingAssembly().Location設定している場合、はそこでリソースを探します。Directory.SetCurrentDirectory("D:\\");@".\"

于 2013-07-15T20:40:50.777 に答える