Clase System.Resources.MissingManifestResourceException

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Se produce una MissingManifestResourceException excepción por diferentes motivos en .NET frente a aplicaciones para UWP.

Aplicaciones .NET

En las aplicaciones .NET, MissingManifestResourceException se produce cuando se produce un error en el intento de recuperar un recurso porque el conjunto de recursos para la referencia cultural neutral no se pudo cargar desde un ensamblado determinado. Aunque se produce la excepción al intentar recuperar un recurso determinado, se debe al error al cargar el conjunto de recursos en lugar del error para encontrar el recurso.

Nota:

Para obtener más información, vea la sección "Control de una excepción MissingManifestResourceException" en el tema de la ResourceManager clase.

Las principales causas de la excepción son las siguientes:

  • El conjunto de recursos no se identifica mediante su nombre completo. Por ejemplo, si el baseName parámetro de la llamada al ResourceManager.ResourceManager(String, Assembly) método especifica el nombre raíz del conjunto de recursos sin un espacio de nombres, pero al conjunto de recursos se le asigna un espacio de nombres cuando se almacena en su ensamblado, la llamada al ResourceManager.GetString método produce esta excepción.

    Si ha incrustado el archivo .resources que contiene los recursos de la referencia cultural predeterminada en el archivo ejecutable y la aplicación inicia una MissingManifestResourceException, puede usar una herramienta de reflexión como el desensamblador de IL (Ildasm.exe) para determinar el nombre completo del recurso. En ILDasm, haga doble clic en la etiqueta MANIFEST del ejecutable para abrir la ventana MANIFEST. Los recursos aparecen como .mresource elementos y se muestran después de las referencias de ensamblado externas y los atributos de nivel de ensamblado personalizados. También puede compilar la siguiente utilidad simple, que enumera los nombres completos de los recursos incrustados en el ensamblado cuyo nombre se le pasa como parámetro de línea de comandos.

    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
    
  • Identifique el recurso establecido por su nombre de archivo de recursos (junto con su espacio de nombres opcional) y su extensión de archivo en lugar de por su espacio de nombres y nombre de archivo raíz solo. Por ejemplo, esta excepción se produce si el conjunto de recursos de la referencia cultural neutral se denomina GlobalResources y se proporciona un valor de GlobalResources.resources (en lugar de GlobalResources) al baseName parámetro del ResourceManager.ResourceManager(String, Assembly) constructor.

  • No se encuentra el conjunto de recursos específico de la referencia cultural que se identifica en una llamada de método y no se puede cargar el conjunto de recursos de reserva. Por ejemplo, si crea ensamblados satélite para las referencias culturales inglés (Estados Unidos) y Rusia (ruso), pero no proporciona un conjunto de recursos para la referencia cultural neutral, esta excepción se produce si la referencia cultural actual de la aplicación es inglés (Reino Unido).

MissingManifestResourceException usa HRESULT COR_E_MISSINGMANIFESTRESOURCE, que tiene el valor 0x80131532.

MissingManifestResourceException usa la implementación predeterminada Equals, que admite la igualdad de referencias.

Para obtener una lista de valores de propiedad iniciales de una instancia de MissingManifestResourceException, consulte el MissingManifestResourceException constructores.

Nota:

Se recomienda incluir un conjunto neutro de recursos en el ensamblado principal, por lo que la aplicación no producirá un error si un ensamblado satélite no está disponible.

Aplicaciones de la Plataforma universal de Windows (UWP)

Las aplicaciones para UWP implementan recursos para varias referencias culturales, incluida la referencia cultural neutra, en un único archivo de índice de recursos de paquete (.pri). Como resultado, en una aplicación para UWP, si no se encuentran recursos para la referencia cultural preferida, se MissingManifestResourceException produce en cualquiera de las condiciones siguientes:

  • La aplicación no incluye un archivo .pri o no se pudo abrir el archivo .pri.
  • El archivo .pri de la aplicación no contiene un conjunto de recursos para el nombre raíz especificado.