System.Resources.MissingManifestResourceException 类
本文提供了此 API 参考文档的补充说明。
MissingManifestResourceException由于 .NET 与 UWP 应用中的不同原因,引发异常。
.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("{0} does not exist.", filename); return; } // Try to load the assembly. Assembly assem = Assembly.LoadFrom(filename); Console.WriteLine("File: {0}", 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: {0}", 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
中性区域性的资源集,并且向构造函数的参数ResourceManager.ResourceManager(String, Assembly)提供值GlobalResources.resources
(而不是)GlobalResources
baseName
,则会引发此异常。找不到方法调用中标识的区域性特定的资源集,并且无法加载回退资源集。 例如,如果为英语(美国)和俄罗斯(俄罗斯)区域性创建附属程序集,但无法为中性区域性提供资源集,则如果你的应用当前区域性为英语(英国),则会引发此异常。
MissingManifestResourceException 使用具有值0x80131532的 HRESULT COR_E_MISSINGMANIFESTRESOURCE
。
MissingManifestResourceException 使用默认的 Equals 实现,这会支持引用相等性。
有关实例的初始属性值的列表MissingManifestResourceException,请参阅MissingManifestResourceException构造函数。
注意
建议在主程序集中包含一组中性资源,因此,如果附属程序集不可用,应用不会失败。
通用 Windows 平台 (UWP) 应用
UWP 应用在单个包资源索引 (.pri) 文件中部署多个区域性的资源,包括中性区域性。 因此,在 UWP 应用中,如果找不到首选区域性的资源,则会 MissingManifestResourceException 在以下任一条件下引发:
- 应用不包含 .pri 文件,或者无法打开 .pri 文件。
- 应用的 .pri 文件不包含给定根名称的资源集。