gpt4 book ai didi

c# - 如何从可在运行时使用的资源文件创建和调用类对象?

转载 作者:行者123 更新时间:2023-11-30 23:22:37 25 4
gpt4 key购买 nike

我正在尝试创建消息代码的资源文件。我创建了一个小型控制台示例,当我尝试调用对象时失败了。

我基于这个 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; }
}
}
}

最佳答案

…and add that file to the project

如何?您是在 IDE 中添加文件吗?如果是这样,那将行不通……将文件视为纯二进制数据;它不被解释为资源数据本身。您需要使用 /resource在命令行上或使用 al.exe事后嵌入 .resource 文件。

如果您希望能够简单地将生成的资源输出添加到您的项目中,您可能需要使用 ResXResourceWriter而不是 ResourceWriter .然后您将获得一个 .resx 文件,您可以将其直接添加到项目中。 Visual Studio 会将 .resx 文件编译为 .resources 文件并自动正确嵌入。

这还具有生成人类可读文件的优势,并且还可以在 IDE 中打开该文件(尽管功能有限,具体取决于您放入其中的类型)。

注意事项:

  • ResXResourceWriter类实际上是在 System.Windows.Forms.dll 中定义的,因此您需要在项目中包含对该程序集的引用。
  • 您写入 .resx 文件的类型需要能够在编译时被引用,这意味着它们不能在您正在编译的同一程序集中。您需要将它们放在您的程序引用的单独 DLL 中。
  • ResourceManager .resx 文件的名称将在您的项目上下文中完全限定。因此,例如,假设您将 .resx 文件添加为项目中的顶级文件,您将需要加载 "ResourceDemo.StatusItems"而不仅仅是 "StatusItems" .如果您添加 .resx 文件“作为链接”,它默认会在您的项目中结束,包含在与文件系统对应的文件夹中,例如“bin\Debug\StatusItems.resx”。在这种情况下,经理姓名将为 "ResourceDemo.bin.Debug.StatusItems" .

关于最后一点,如果您对名称有任何疑问,可以使用 Assembly.GetManifestResourceNames()检查已编译到程序中的名称是什么。

关于c# - 如何从可在运行时使用的资源文件创建和调用类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38705538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com