Поделиться через


Класс System.Resources.MissingManifestResourceException

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

MissingManifestResourceException Исключение создается по разным причинам в приложениях .NET и UWP.

Приложения .NET

В приложениях .NET возникает ошибка при попытке получить ресурс, MissingManifestResourceException так как не удалось загрузить набор ресурсов для нейтрального языка и региональных параметров из определенной сборки. Хотя исключение возникает при попытке получить определенный ресурс, это вызвано сбоем загрузки набора ресурсов, а не сбоем поиска ресурса.

Примечание.

Дополнительные сведения см. в разделе "Обработка исключения MissingManifestResourceException" в ResourceManager разделе класса.

Основными причинами исключения являются следующие:

  • Набор ресурсов не определяется его полным именем. Например, если 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 , и вы предоставляете значение GlobalResources.resources (а не GlobalResources) параметру baseNameResourceManager.ResourceManager(String, Assembly) конструктора.

  • Набор ресурсов, определенный в вызове метода, не найден, а резервный набор ресурсов не может быть загружен. Например, если вы создаете вспомогательные сборки для английских (США) и региональных параметров (россия), но не удается предоставить набор ресурсов для нейтрального языка и региональных параметров, это исключение возникает, если текущий язык и региональные параметры приложения — английский (Соединенное Королевство).

MissingManifestResourceException использует HRESULT COR_E_MISSINGMANIFESTRESOURCE, который имеет значение 0x80131532.

MissingManifestResourceException использует реализацию по умолчанию Equals , которая поддерживает равенство ссылок.

Список начальных значений свойств для экземпляра MissingManifestResourceException, см. в разделе MissingManifestResourceException конструкторы.

Примечание.

Рекомендуется включить нейтральный набор ресурсов в основную сборку, поэтому приложение не завершится ошибкой, если вспомогательные сборки недоступны.

приложения универсальной платформы Windows (UWP);

Приложения UWP развертывают ресурсы для нескольких языков и региональных параметров, включая нейтральный язык и региональные параметры, в одном файле индекса ресурсов пакета (PRI). В результате в приложении UWP, если ресурсы для предпочитаемого языка и региональных параметров не удается найти, MissingManifestResourceException создается в любом из следующих условий:

  • Приложение не содержит pri-файл или не удалось открыть PRI-файл.
  • PRI-файл приложения не содержит набор ресурсов для заданного корневого имени.