Share via


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(而不是)GlobalResourcesbaseName,则会引发此异常。

  • 找不到方法调用中标识的区域性特定的资源集,并且无法加载回退资源集。 例如,如果为英语(美国)和俄罗斯(俄罗斯)区域性创建附属程序集,但无法为中性区域性提供资源集,则如果你的应用当前区域性为英语(英国),则会引发此异常。

MissingManifestResourceException 使用具有值0x80131532的 HRESULT COR_E_MISSINGMANIFESTRESOURCE

MissingManifestResourceException 使用默认的 Equals 实现,这会支持引用相等性。

有关实例的初始属性值的列表MissingManifestResourceException,请参阅MissingManifestResourceException构造函数。

注意

建议在主程序集中包含一组中性资源,因此,如果附属程序集不可用,应用不会失败。

通用 Windows 平台 (UWP) 应用

UWP 应用在单个包资源索引 (.pri) 文件中部署多个区域性的资源,包括中性区域性。 因此,在 UWP 应用中,如果找不到首选区域性的资源,则会 MissingManifestResourceException 在以下任一条件下引发:

  • 应用不包含 .pri 文件,或者无法打开 .pri 文件。
  • 应用的 .pri 文件不包含给定根名称的资源集。