Я пытаюсь создать файл ресурсов кодов сообщений. Я создал небольшой пример консоли, который терпит неудачу, когда я пытаюсь вызвать объект.Как создать и вызвать объекты класса из файла ресурсов, который я могу использовать во время выполнения?
Я основывал это на этом примере MSDN -Creating Resource Files, но я не знаю, что я пропустил, пытаясь упростить его.
В коде я запускаю его один раз для создания файла ресурсов и добавления этого файла в проект. Затем я перекомпиляю, чтобы запустить код отзыва.
using System;
using System.Reflection;
using System.Resources;
namespace ResourceDemo
{
internal class Program
{
private static void Main(string[] args)
{
bool generateMode = false;
if (generateMode) {
// After running once with generate mode set to true, add the resulting
// "StatusItem.resource" that was created in the .\bin\x86\Debug folder
// to the project.
Generate();
}
else {
// When run the next line generates an exception:
// An unhandled exception of type 'System.Resources.MissingManifestResourceException' occurred in mscorlib.dll
//
// Additional information: Could not find any resources appropriate for the specified culture
// or the neutral culture. Make sure "StatusItems.resources" was correctly embedded or linked
// into assembly "ResourceDemo" at compile time, or that all the satellite assemblies required
// are loadable and fully signed.
StatusItem statusItem = GetResource("2");
Console.WriteLine("Id: {0} Message: {1}", statusItem.Id.ToString(), statusItem.Message);
Console.ReadKey();
}
}
public static void Generate()
{
StatusItem[] statusItem = new StatusItem[4];
// Instantiate an Status object items.
statusItem[0] = new StatusItem(2, "File not found");
statusItem[1] = new StatusItem(3, "Path not found");
statusItem[2] = new StatusItem(4, "Too many open files");
statusItem[3] = new StatusItem(5, "File access denied");
// Define a resource file named StatusItems.resx.
using (System.Resources.ResourceWriter rw = new ResourceWriter(@".\StatusItems.resources")) {
for (int i = 0; i < 4; i++) {
rw.AddResource(statusItem[i].Id.ToString(), statusItem[i]);
}
rw.Generate();
}
}
public static StatusItem GetResource(string key)
{
Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Resources.ResourceManager rm = new System.Resources.ResourceManager("StatusItems", Assembly.Load("ResourceDemo"));
return (StatusItem)rm.GetObject(key);
}
[Serializable()]
public class StatusItem
{
public StatusItem(int id, string message)
{
Id = id;
Message = message;
}
public int Id { get; set; }
public string Message { get; set; }
}
}
}
Я просто добавил существующий элемент к проекту. Я компилирую в ID, какую команду kine добавить параметр/resource? –
@Rich: вам нужно будет скомпилировать ваш .cs-файл из командной строки с помощью csc.exe, предоставив переключатель '/ resource' для файла .resources, который вы хотите включить. Если вы хотите использовать формат файла .resource и по-прежнему включать его в качестве элемента Embedded Resource в проекте, вам нужно будет извлечь элемент как необработанные данные и класс 'ResourceReader' самостоятельно, чтобы действительно прочитать данные. Лично я бы пошел с опцией файла .resx, поскольку это обеспечивает лучшую интеграцию в обычные механизмы управления ресурсами. –
Но если я использую семейство ResXResourceWriter, мне не нужно будет делать дополнительные шаги? –