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


Класс System.Resources.MissingManifestResourceException

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

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

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

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

Примечание.

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

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

  • Набор ресурсов не определяется его полным именем. Например, если параметр baseName в вызове метода ResourceManager.ResourceManager(String, Assembly) указывает корневое имя набора ресурсов, без пространства имен, но набор ресурсов получает пространство имен при хранении в своей сборке, то вызов метода ResourceManager.GetString приводит к этому исключению.

    Если вы встроили файл .resources, содержащий ресурсы культуры по умолчанию в свой исполняемый файл, и если ваше приложение выдает MissingManifestResourceExceptionисключение, можно использовать средство отражения, такое как IL Disassembler (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) параметру baseNameResourceManager.ResourceManager(String, Assembly) конструктора.

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

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

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

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

Примечание.

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

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

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

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