web-dev-qa-db-ja.com

C#-アセンブリからリソース文字列を取得する最速の方法

私は本当に答えを知らない/持っていない、c#を使用してアセンブリ内のresxファイルからキーを使用してリソース値を見つける知識(または私は無知かもしれません)。

最速のコードは何ですか?アセンブリでリソースとして埋め込みであるリソースファイルからキーを使用してstring valuesまたはvaluesを取得する方法リソースファイルに例外のわかりやすいメッセージを保存していますが、必要に応じてそれらを使用したいと思います。

この目的で静的クラスが存在しますか?

これに使用できるオープンソースの成熟したプロジェクトはありますか?

20
Deeptechtons
Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", Assembly);
string myString = resourceManager.GetString("value");
19
sblom

リソースがコードと同じアセンブリにある場合、次のようになります。

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

this SO answer

40
herzbube
string val = Resources.ResourceManager.GetString("resource_name");

与えられた"resource_name"リソース値を取得できます。

10
SurenSaluka

resourceMangerを使用して、アセンブリから文字列値を取得できます。

アセンブリからリソースを取得

ResourceManager ResManager= new ResourceManager("yourResource", 
            Assembly.GetExecutingAssembly());
String strResourveValue = ResManager.GetString("YourStringKey");
4
Ravi Gadag

UnitTestsと呼ばれるタイプC#クラスライブラリのユニットテスト用に新しいプロジェクトを作成したとき、右クリックして新しいリソースを追加しました。 UnitTestsResourcesという名前を付けました。そのリソースに2つの文字列を追加しました。その後、このように便利にアクセスできました

UnitTestsResources.NoDeviceRequireMsg

私はそれがどのように機能するのか興味があったので、リソースファイルの背後にあるコードを取得しました。 Visual Studioは、静的アクセサを使用して内部クラスを作成しました。

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class UnitTestsResources {

    //Some auto generated code

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device is required for test.
    /// </summary>
    internal static string DeviceRequireMsg {
        get {
            return ResourceManager.GetString("DeviceRequireMsg", resourceCulture);
        }
    }

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device must not be installed for test.
    /// </summary>
    internal static string NoDeviceRequireMsg {
        get {
            return ResourceManager.GetString("NoDeviceRequireMsg", resourceCulture);
        }
    }
}

それは私の単体テストのためだけなので、私はこれに満足しています。それが他の誰かを助けることを願っています。

2
Robert Snyder

Herzbubeの答えを改善するために、これをどのように実装したかを示します。

リソースファイルのプロジェクトまたはフォルダーを作成するのではなく、プロジェクトを右クリックして[追加]-> [新しいアイテム]を選択し、リソースファイルを選択します。文字列にあるリソースファイルスティックを開き、便利な名前で保存し、それらを使用するC#に移動すると、次のようになります。

文字列resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

それが機能しない場合、resxファイル内のアクセス修飾子のドロップダウンに注意してください。

1
Chris
 var thread = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
            var culture = new CultureInfo(thread);
            var resourceManager = new ResourceManager(typeof(Resources.Resource));
            string value = resourceManager.GetString(name, culture);
1
Anup Shetty