本文提供了此 API 参考文档的补充说明。
在 .NET 与 UWP 应用中,由于不同的原因,会引发 MissingManifestResourceException 异常。
.NET 应用
在 .NET 应用中,当尝试检索资源失败时,会引发 MissingManifestResourceException,因为无法从特定程序集中加载非特定区域性的资源集。 尽管尝试检索特定资源时会引发异常,但它是由加载资源集而不是查找资源失败引起的。
注释
有关详细信息,请参阅 ResourceManager 类主题中的“处理 MissingManifestResourceException 异常”部分。
异常的主要原因包括:
资源集不是通过其完全限定名标识的。 例如,如果
baseName
方法调用 ResourceManager.ResourceManager(String, Assembly) 中的参数指定没有命名空间的资源集的根名称,但在资源集存储在其程序集中时会为其分配命名空间,则对方法的调用 ResourceManager.GetString 将引发此异常。如果你已将包含默认区域性资源的 .resources 文件嵌入到了可执行文件中,并且应用程序引发了 MissingManifestResourceException,则可以使用反射工具(例如 IL 反汇编程序 (Ildasm.exe))来确定资源的完整限定名称。 在 ILDasm 中,双击可执行文件的 MANIFEST 标签以打开 清单 窗口。 资源显示为
.mresource
项,并在外部程序集引用和自定义程序集级别属性之后列出。 还可以编译以下简单实用工具,其中列出了程序集中嵌入资源的完全限定名称,其名称作为命令行参数传递给该程序集。using System; using System.IO; using System.Reflection; public class Example0 { public static void Main() { if (Environment.GetCommandLineArgs().Length == 1) { Console.WriteLine("No filename."); return; } string filename = Environment.GetCommandLineArgs()[1].Trim(); // Check whether the file exists. if (! File.Exists(filename)) { Console.WriteLine($"{filename} does not exist."); return; } // Try to load the assembly. Assembly assem = Assembly.LoadFrom(filename); Console.WriteLine($"File: {filename}"); // Enumerate the resource files. string[] resNames = assem.GetManifestResourceNames(); if (resNames.Length == 0) Console.WriteLine(" No resources found."); foreach (var resName in resNames) Console.WriteLine($" Resource: {resName.Replace(".resources", "")}"); Console.WriteLine(); } }
Imports System.IO Imports System.Reflection Imports System.Resources Module Example3 Public Sub Main() If Environment.GetCommandLineArgs.Length = 1 Then Console.WriteLine("No filename.") Exit Sub End If Dim filename As String = Environment.GetCommandLineArgs(1).Trim() ' Check whether the file exists. If Not File.Exists(filename) Then Console.WriteLine("{0} does not exist.", filename) Exit Sub End If ' Try to load the assembly. Dim assem As Assembly = Assembly.LoadFrom(filename) Console.WriteLine("File: {0}", filename) ' Enumerate the resource files. Dim resNames() As String = assem.GetManifestResourceNames() If resNames.Length = 0 Then Console.WriteLine(" No resources found.") End If For Each resName In resNames Console.WriteLine(" Resource: {0}", resName.Replace(".resources", "")) Next Console.WriteLine() End Sub End Module
可以通过其资源文件名(及其可选命名空间)及其文件扩展名(而不是单独由其命名空间和根文件名)来标识资源集。 例如,如果非特定区域性的资源集被命名为
GlobalResources
,并且你向GlobalResources.resources
构造函数的GlobalResources
参数提供了baseName
(而不是 ResourceManager.ResourceManager(String, Assembly))的值,则会引发此异常。无法找到在方法调用中识别的文化特定的资源集,并且无法加载回退资源集。 例如,如果为英语(美国)和俄罗斯(俄文)文化创建附属程序集,但无法为非特定区域性提供资源集,则当应用程序的当前文化为英语(英国)时,会引发此异常。
MissingManifestResourceException 使用具有值0x80131532的 HRESULT COR_E_MISSINGMANIFESTRESOURCE
。
MissingManifestResourceException 使用支持引用相等性的默认 Equals 实现。
有关实例 MissingManifestResourceException的初始属性值列表,请参阅 MissingManifestResourceException 构造函数。
注释
建议在主程序集中包含一组中性资源,因此,如果附属程序集不可用,应用不会失败。
通用 Windows 平台 (UWP) 应用
UWP 应用将多个文化的资源,包括中性文化,部署在一个包资源索引 (.pri) 文件中。 因此,在 UWP 应用中,如果找不到首选区域性的资源,则在以下任一条件下会引发 MissingManifestResourceException:
- 应用不包含 .pri 文件,或者无法打开 .pri 文件。
- 应用的 .pri 文件不包含给定根名称的资源集。