web-dev-qa-db-ja.com

ResourceManagerを使用する

C#クラスでResourceManagerを使用しようとしていますが、ResourceManagerクラスの新しいインスタンスを作成するときにベース名の代わりに何を使用するのかわかりません。

上記のプロジェクトで参照されるリソースファイルを含む別のプロジェクトがあり、次の名前が付けられています。

  • Resources.resx
  • Resources.es-ES.resx

次のようなコードスニペットがある場合、リソースの英語版またはスペイン語版を使用する場合、ベース名の代わりに何を使用する必要がありますか?

ResourceManager RM = new ResourceManager(basename,Assembly.GetExecutingAssembly());

トムが提案したアプローチを試しましたが、悪名高いエラーが発生しています

指定されたカルチャまたはニュートラルカルチャに適したリソースが見つかりませんでした。

私のソリューションには、プロジェクトYeagerTechがWebアプリケーションであり、プロジェクトYeagerTechResourcesにすべてのリソースが含まれる2つのプロジェクトがあります。プロジェクトYeagerTechにはYeagerTechResourcesへの参照があります。

リソースマネージャーを作成するとき、次の構文があります。

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources",
    Assembly.GetExecutingAssembly());

明らかに、それは間違っています。

YeagerTechResourcesプロジェクトのリソースファイルには、BuildActionがEmbedded Resourceに設定されています。

リソースファイルの名前はResources.resxとResources.es-ES.resxです。

リソースマネージャーをインスタンス化するときに、プロジェクトとリソースファイル名に基づいて使用する正確な構文を誰かが簡単に教えてくれれば、とても感謝しています...

私はこれを解決するために考えることができるすべてをしましたが、できません....

これはここでそれを解決する最後の試みです...

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources", Assembly.GetExecutingAssembly());

sb.Append(RM.GetString("RegisterThanks"));

上記のコードを実行した後、次のエラーが表示されます。

指定されたカルチャまたはニュートラルカルチャに適したリソースが見つかりませんでした。 「YeagerTechResources.Resources.resources」がコンパイル時にアセンブリ「YeagerTech」に正しく埋め込まれているかリンクされていること、または必要なすべてのサテライトアセンブリがロード可能で完全に署名されていることを確認します。

HTMLマークアップのリソースをまったく問題なく使用できますが、コントローラーのC#コードにアクセスすると、上記のエラーが引き続き発生します。

私のプロジェクトに基づいて必要な正確な構文の助けをいただければ幸いです。

25
sagesky36

文字列でリソースを読み取る驚くほど簡単な方法があります:

ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")

「ドット表記」が使用できないキーでリソースを読み取るためのクリーンでエレガントなソリューションです(たとえば、リソースキーがデータベースに保持されている場合)。

42
Landeeyo

生成された.resourcesファイルを見るために必要な文字列をチェックするための迅速で汚い方法.

.resourcesは、resourcesプロジェクトobj/Debugディレクトリに生成されます。 (ソリューションエクスプローラーで.resxファイルを右クリックし、「カスタムツールの実行」をクリックして.resourcesファイルを生成します)

このディレクトリに移動して、ファイル名を確認します。 XYZ.resourcesで終わるファイルが表示されます。そのファイル名をコピーし、末尾の.resourcesを削除します。これがロードするファイルです。

たとえば、私のobj/Binディレクトリには次のファイルがあります。

MyLocalisation.Properties.Resources.resources

リソースファイルが同じクラスライブラリ/アプリケーションにある場合、次のC#を使用します。

ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", Assembly.GetExecutingAssembly());

しかし、おそらくあなたが望む別のクラスライブラリ/アプリケーションからリソースファイルを使用しているように聞こえます

Assembly localisationAssembly = Assembly.Load("MyLocalisation");
ResourceManager RM =  new ResourceManager("MyLocalisation.Properties.Resources", localisationAssembly);
17
SinOB

このSO answer はこの場合に役立つかもしれません。
mainプロジェクトがすでにresourceプロジェクトを参照している場合、コード内で生成されたリソースクラスを明示的に操作し、そのResourceManagerにアクセスできます。したがって、次の行に沿ったもの:

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

// then, you could go on working with that
ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
// ...
10
superjos

MSDNドキュメントによると、 here 、basename引数は「」を指定します。拡張子なしで、完全修飾ネームスペース名を含むリソースファイルのルート名。たとえば、 「MyApplication.MyResource.en-US.resources」という名前のリソースファイルのルート名は「MyApplication.MyResource」です。

ResourceManagerは、現在のUIカルチャの値を自動的に取得しようとします。特定の言語を使用する場合は、現在のUIカルチャを使用する言語に設定する必要があります。

4
Tom Lint

原則として、@ Landeeyosと同じ考えです。とにかく、その応答を拡大します:パーティーに少し遅れましたが、ここに私の2セントがあります:

シナリオ:

WPFアプリケーションで事前定義済みのテンプレートファイル(約28個のテキストファイル)を追加するというユニークなケースがあります。そのため、このアプリをインストールするたびに、これらのテンプレート、テキストファイルをすぐに使用できるようにするという考え方があります。とにかく、私がやったのは、resource.resxを追加することでファイルを保持するための別のライブラリを作成したことです。次に、これらすべてのファイルをこのリソースファイルに追加しました(.resxファイルをダブルクリックすると、そのデザイナーがVisual Studioで開かれます)。すべてのアクセス修飾子をパブリックに設定しました。また、各テキストファイルのビルドアクションを使用して、各ファイルが埋め込みリソースとしてマークされました(そのプロパティを確認することで取得できます)。このbibliothek1.dllを呼び出して、上記のライブラリ(bibliothek1.dll)を別のライブラリ(bibliothek2.dllと呼びます)で参照し、mf wpfアプリでこの2番目のライブラリを使用します。

実際の楽しみ:

        // embedded resource file name <i>with out extension</i>(this is vital!) 

        string fileWithoutExt = Path.GetFileNameWithoutExtension(fileName);

        // is required in the next step

        // without specifying the culture
        string wildFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt);
        Console.Write(wildFile);

        // with culture
        string culturedFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt, CultureInfo.InvariantCulture);
        Console.Write(culturedFile);

サンプル: checkout 'testingresourcefilesusage' @ https://github.com/Natsikap/samples.git

いつかどこかで誰かの助けになることを願っています!

0
Ada_Spark

同様の問題を経験しました。 「YeagerTechResources.Resources」を考慮すると、Resources.resxがプロジェクトのルートフォルダーにあることを意味します。

ResourceManagerコンストラクターへの完全なパス(例: "project\subfolder(s)\ file [.resx]")を含めるように注意してください。

0
leguminator