访问 resx 文件时出现 MissingManifestResourceException 异常

10 浏览
0 Comments

访问 resx 文件时出现 MissingManifestResourceException 异常

在尝试访问resx文件时,我遇到了MissingManifestResourceException异常。

我有一个工作正常的代码片段和一个不工作的代码片段。我不确定发生了什么。

工作正常的代码片段

static void Main(string[] args)
{
    //注意我传递的第一个参数,它包含“ .Lang”
    var rm = new ResourceManager("ConsoleApp1.App_GlobalResources.Lang", Assembly.GetExecutingAssembly());
    var ci = Thread.CurrentThread.CurrentCulture;
    var a = rm.GetString("Name", ci);
    Console.WriteLine("Hello World!");
}

不工作的代码片段:

static void Main(string[] args)
{
    //注意第一个参数没有“ .Lang”。
    var rm = new ResourceManager("ConsoleApp1.App_GlobalResources", Assembly.GetExecutingAssembly());
    var ci = Thread.CurrentThread.CurrentCulture;
    var a = rm.GetString("Name", ci);
    Console.WriteLine("Hello World!");
}

我的解决方案结构:

enter image description here

Lang.en-US文件的属性(工作正常):

enter image description here

en-US文件的属性(不工作):

enter image description here

问题1:为什么Lang.en-US没有生成任何.CS文件,但仍然工作正常?

问题2:为什么一个基本的裸en-US.resx会创建一个.CS文件,但仍然不工作。

我查看的链接:SO LINK

图片1:

enter image description here

图片2:

enter image description here

0
0 Comments

在访问resx文件时出现MissingManifestResourceException异常的原因是因为没有找到特定语言的资源文件。解决方法是使用正确的资源管理器和文件命名规则。

在Working示例中,ResourceManager将"Lang"作为虚拟文件前缀集进行加载。GetString(Key, Culture)方法会尝试查找正确的语言资源文件,如果找不到,则会回退到默认的非特定语言文件。例如,对于'en-US',它会尝试查找Lang.en-US.resx文件,如果找不到则默认使用Lang.resx文件。

而Non-Working示例不起作用,是因为没有给它一个虚拟文件前缀,而是给了一个文件夹路径。

解决方法是使用以下多语言文件的理想情况:

语言文件夹(例如:App_GlobalResources [不好的名字])

- Lang.resx:默认的非特定语言文件

- Lang.en-US.resx:en-US语言文件

- Lang.he.resx:he语言文件

代码示例:

var rm = new ResourceManager("ConsoleApp1.App_GlobalResources.Lang", Assembly.GetExecutingAssembly());

在Working示例中,ResourceManager使用了正确的资源管理器和文件命名规则,所以可以正常工作。

简单来说,Code Snippet 1之所以能正常工作,是因为使用了正确的ResourceManager和文件命名规则。

0