31

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

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

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

次のようなコード スニペットがある場合、英語版またはスペイン語版のリソースを使用する場合、ベース名を何に置き換えればよいですか?

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

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

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

私のソリューションには 2 つのプロジェクトがあり、プロジェクト YeagerTech は Web アプリケーションであり、プロジェクト YeagerTechResources にはすべてのリソースが含まれています。Project 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# コードにアクセスすると、上記のエラーが発生し続けます。

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

4

6 に答える 6

54

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

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

これは、"ドット表記" を使用できない場合 (たとえば、リソース キーがデータベースに永続化されている場合) にキーでリソースを読み取るためのクリーンで洗練されたソリューションです。

于 2015-04-22T08:57:15.713 に答える
21

生成された .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);
于 2012-02-09T13:43:15.980 に答える
11

この SO の回答は、この場合に役立つ場合があります。メインプロジェクトが既にリソース
プロジェクトを参照している 場合は、コード内で生成されたリソース クラスを明示的に操作し、そこからアクセスすることができます。したがって、次のようなものです。ResourceManager

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

// then, you could go on working with that
ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
// ...
于 2013-08-22T09:00:15.210 に答える
4

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

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

于 2012-01-11T19:55:11.337 に答える
0

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

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

于 2016-04-18T09:33:35.120 に答える