C#で.resxファイルから文字列を読み取る


99

C#で.resxファイルから文字列を読み取る方法は?ガイドラインを送ってください。一歩一歩


このリンクを見てください、それは役立つはずです。
アドリアンスタンダー

15
なぜ?彼らが私の質問に私を満足させなかったなら、なぜ私は間違った提案を受け入れなければならないのですか?
レッドスワン

1
.resxファイルがVisual Studioを使用してプロジェクトのプロパティで追加された場合、文字列にアクセスする簡単でエラーが発生しにくい方法については、私の回答を参照しください。
Joshcodes 2013

回答:


75

この例は、ResourceManager.GetString()のMSDNページからの抜粋です

// Create a resource manager to retrieve resources.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());

// Retrieve the value of the string resource named "welcome".
// The resource manager will retrieve the value of the  
// localized resource using the caller's current culture setting.
String str = rm.GetString("welcome");

4
私が参照したMSDNページから:baseNameリソースファイルのルート名(拡張子なし、ただし完全修飾名前空間名を含む)。たとえば、MyApplication.MyResource.en-US.resourcesという名前のリソースファイルのルート名はMyApplication.MyResourceです。
JeffH 2014

1
items ==リソースファイルの名前空間

7
悪い例:アイテムは名前空間+リソースのルートタイプであることを説明する必要がある
ActiveX

ResourceManager外部リソースをロードする場合にのみ必要です。<Namespace>.Properties代わりに使用してください。
Yousha Aleayoub

131

ResourceManager外部リソースからロードしているのでない限り、必要ありません。
ほとんどの場合、プロジェクトの名前空間「リソース」とリソース識別子を使用するだけでプロジェクト(DLL、WinFormsなど)を作成したとしましょう。例えば:

プロジェクトの名前空間を想定: UberSoft.WidgetPro

そしてあなたのresxには以下が含まれます:

resxコンテンツの例

あなたはただ使うことができます:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

4
この答えをたくさんありがとう。
ヴァイシャリ2018

1
ありがとう、これは答えとしてマークされるべきです。この質問の「回答」よりもはるかに明確で明確です。
Jeroen Jonkman

タイプまたは名前空間は存在しません
Paul McCarthy

53

これを試してみてください、私にとってはうまくいきます。

リソースファイル名が「TestResource.resx」であり、動的にキーを渡したいとします。

string resVal = TestResource.ResourceManager.GetString(dynamicKeyVal);

名前空間を追加

using System.Resources;

必要に応じて、カルチャを指定することもできます。デフォルトと矛盾するカルチャ固有の出力を確認する場合に便利です。例:TestResource.ResourceManager.GetString(description、new CultureInfo( "en-GB"));
Ian

次のエラーが表示されます。「リソース」に「GetString」の定義が含まれていません。
Lechucico

ResourceManager外部リソースをロードする場合にのみ必要です。<Namespace>.Properties代わりに使用してください。
Yousha Aleayoub

29

.resxファイルを開き、「Access Modifier」をPublicに設定します。

var <Variable Name> = Properties.Resources.<Resource Name>

2
このメソッドは複数のリソースファイル(言語)で機能し、ResourceManagerメソッドを使用するように見えるすべての場所でこの方法を使用するリスクを負うかどうか疑問に思います...
deadManN

1
動作しません。リソースファイルがpublicに設定されていても、Properties.Resources。 "my filename"の後に表示されません
user1804084

27

.resxファイルがプロジェクトのプロパティの下でVisual Studioを使用して追加されたと仮定すると、文字列にアクセスするための簡単でエラーが発生しにくい方法があります。

  1. ソリューションエクスプローラーで.resxファイルを展開すると、.Designer.csファイルが表示されます。
  2. 開くと、.Designer.csファイルにはProperties名前空間と内部クラスがあります。この例では、クラスの名前がResourcesであると想定しています。
  3. 文字列へのアクセスは次のように簡単です。

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. JoshCodes.Core.Testing.Unitプロジェクトのデフォルトの名前空間に置き換えます。

  5. 「exampleXml」を文字列リソースの名前に置き換えます。

3
非常に役立ちます。ありがとう。
ejmin 2016

16

@JeffHの回答が続くtypeof()ので、文字列アセンブリ名よりも使用することをお勧めします。

    var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
    string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));

10

何らかの理由でリソースファイルをApp_GlobalResourcesに配置できない場合は、ResXResourceReaderまたはXMLリーダーを使用してリソースファイルを直接開くことができます。

ResXResourceReaderを使用するためのサンプルコードを次に示します。

   public static string GetResourceString(string ResourceName, string strKey)
   {


       //Figure out the path to where your resource files are located.
       //In this example, I'm figuring out the path to where a SharePoint feature directory is relative to a custom SharePoint layouts subdirectory.  

       string currentDirectory = Path.GetDirectoryName(HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"]));

       string featureDirectory = Path.GetFullPath(currentDirectory + "\\..\\..\\..\\FEATURES\\FEATURENAME\\Resources");

       //Look for files containing the name
       List<string> resourceFileNameList = new List<string>();

       DirectoryInfo resourceDir = new DirectoryInfo(featureDirectory);

       var resourceFiles = resourceDir.GetFiles();

       foreach (FileInfo fi in resourceFiles)
       {
           if (fi.Name.Length > ResourceName.Length+1 && fi.Name.ToLower().Substring(0,ResourceName.Length + 1) == ResourceName.ToLower()+".")
           {
               resourceFileNameList.Add(fi.Name);

           }
        }

       if (resourceFileNameList.Count <= 0)
       { return ""; }


       //Get the current culture
       string strCulture = CultureInfo.CurrentCulture.Name;

       string[] cultureStrings = strCulture.Split('-');

       string strLanguageString = cultureStrings[0];


       string strResourceFileName="";
       string strDefaultFileName = resourceFileNameList[0];
       foreach (string resFileName in resourceFileNameList)
       {
           if (resFileName.ToLower() == ResourceName.ToLower() + ".resx")
           {
               strDefaultFileName = resFileName;
           }

           if (resFileName.ToLower() == ResourceName.ToLower() + "."+strCulture.ToLower() + ".resx")
           {
               strResourceFileName = resFileName;
               break;
           }
           else if (resFileName.ToLower() == ResourceName.ToLower() + "." + strLanguageString.ToLower() + ".resx")
           {
               strResourceFileName = resFileName;
               break;
           }
       }

       if (strResourceFileName == "")
       {
           strResourceFileName = strDefaultFileName;
       }



       //Use resx resource reader to read the file in.
       //https://msdn.microsoft.com/en-us/library/system.resources.resxresourcereader.aspx

       ResXResourceReader rsxr = new ResXResourceReader(featureDirectory + "\\"+ strResourceFileName);         

       //IDictionaryEnumerator idenumerator = rsxr.GetEnumerator();
       foreach (DictionaryEntry d in rsxr)
       {
           if (d.Key.ToString().ToLower() == strKey.ToLower())
           {
               return d.Value.ToString();
           }
       }


       return "";
   }

System.Windows.Forms使用するには、への参照を追加する必要があることに注意してくださいSystem.Resources.ResXResourceReader。また、var enumerator = rsxr.OfType<DictionaryEntry>();代わりにLINQを実行して使用することもできます。
2015

resxファイルを「読み取り、解析、ロード」する方法に関する記事や投稿を見つけるのは非常に困難です。取得するのは「resxをプロジェクトの文字列のコンテナーとして使用する」だけです。この回答ありがとうございます!
Simone

9

リソース(名前:ResourceNameおよび値:ResourceValue)をソリューション/アセンブリに追加したら、「Properties.Resources.ResourceName」を使用して必要なリソースを取得できます。


7

Visual Studio経由で.resxファイルを追加しました。これにより、designer.cs必要なキーの値をすぐに返すプロパティを持つファイルが作成されました。たとえば、これはデザイナファイルから自動生成されたコードです。

/// <summary>
///   Looks up a localized string similar to When creating a Commissioning change request, you must select valid Assignees, a Type, a Component, and at least one (1) affected unit..
/// </summary>
public static string MyErrorMessage {
    get {
        return ResourceManager.GetString("MyErrorMessage", resourceCulture);
    }
}

そのようにして、私は簡単に行うことができました:

string message = Errors.MyErrorMessage;

Visual Studioで作成されErrorsErrors.resxファイルがどこにあるかがMyErrorMessageキーです。


うん、たった今これがVS2015です。右クリックして「Resources」ファイルを追加すると、すべてのキーが「dottable」になります。したがって、キーが「Script」の「MyResx.resx」には、文字列scriptValue = MyResx.Script;のようにアクセスできます。
emery.noel 2017年

5

リソースファイルをプロジェクトに直接追加したので、resxファイル名で内部の文字列にアクセスできました。

例:Resource1.resxでは、キー "resourceKey"->文字列 "dataString"。文字列「dataString」を取得するには、Resource1.resourceKeyを配置するだけです。

知らない理由があるかもしれませんが、私にとってはうまくいきました。


3

これを行う最も簡単な方法は次のとおりです。

  1. App_GlobalResourcesシステムフォルダーを作成し、そこにリソースファイル(Messages.resxなど)を追加します。
  2. リソースファイルにエントリを作成します。例:ErrorMsg =これはエラーです。
  3. 次に、そのエントリにアクセスします。string errormsg = Resources.Messages.ErrorMsg

2

リソースファイルから値を取得する最も簡単な方法。プロジェクトにリソースファイルを追加します。追加したい文字列を、私の場合はテキストブロック(SilverLight)のように取得します。名前空間も追加する必要はありません。私の場合は問題なく機能します

txtStatus.Text = Constants.RefractionUpdateMessage;

定数は、プロジェクト内のリソースファイル名です。ここに私のリソースファイルがどのように見えるか


0

リソースを取得するリソースマネージャを作成します。

ResourceManager rm = new ResourceManager("param1",Assembly.GetExecutingAssembly());

String str = rm.GetString("param2");

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 =リソースファイルから取得する文字列の名前


0

これでうまくいきます。文字列okが含まれているstrings.resxファイルがあるとします。それを読む

String varOk = My.Resources.strings.ok
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.