访问 resx 文件时出现 MissingManifestResourceException 异常
访问 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!"); }
我的解决方案结构:
Lang.en-US文件的属性(工作正常):
en-US文件的属性(不工作):
问题1:为什么Lang.en-US没有生成任何.CS文件,但仍然工作正常?
问题2:为什么一个基本的裸en-US.resx会创建一个.CS文件,但仍然不工作。
我查看的链接:SO LINK
图片1:
图片2:
在访问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和文件命名规则。