С# - самый быстрый способ получить строку из ресурсов сборки

Я действительно не знаю / есть ответ, знание, чтобы найти значение ресурса, используя ключ от resx файл в сборке с использованием c#.(или может быть я невежда).

какой был бы самый быстрый код, как я могу получить string values или values используя ключ из файла ресурсов, который составляет встроенный как ресурс в сборке. Я храню дружественные сообщения для исключений в файле ресурсов и хотел бы использовать их при необходимости.

делает статический класс существуют для этой цели?

есть ли зрелые проекты с открытым исходным кодом, которые я могу использовать для этого?

7 ответов


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

если ресурс находится в той же сборке, что и код, то будет сделано следующее:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

принято от это так ответ.


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

дано "resource_name" вы можете получить значение ресурса.


вы можете использовать ResourceManger для получения строкового значения из Assembly

получить ресурс из сборки

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

когда я сделал новый проект для моих модульных тестов библиотеки классов типа C# под названием UnitTests, я щелкнул правой кнопкой мыши и добавил новый ресурс. Я назвал это 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);
        }
    }
}

поскольку это только для моих модульных тестов, я доволен этим. Надеюсь, это поможет кому-то еще.


чтобы улучшить ответ herzbube, я покажу, как я это реализовал..

вместо создания проектов и папки для файла ресурсов, просто щелкните правой кнопкой мыши проект и добавить->новый элемент, а затем выберите файл ресурсов. Откройте файл ресурсов stick в ваших строках, сохраните как полезное имя и перейдите к C#, где вы хотите их использовать, тогда это просто:

String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

Если что не работает обратите внимание на выпадающий модификатор доступа, когда внутри вашего файла resx.


 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);