Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

Взято из этого SO-ответа.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

Когда я создал новый проект для модульных тестов библиотеки классов типа С# под названием 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);
        }
    }
}

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

Ответ 6

Чтобы улучшить ответ на herzbube, я покажу, как я это сделал.

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

String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

Если это не работает, обратите внимание на модификатор доступа, когда он находится внутри вашего файла resx.

Ответ 7

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