Condividi tramite


Classe System.Resources.MissingManifestResourceException

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Viene generata un'eccezione MissingManifestResourceException per motivi diversi in .NET rispetto alle app UWP.

App .NET

Nelle app .NET, MissingManifestResourceException viene generato quando il tentativo di recuperare una risorsa non riesce perché non si è riusciti a caricare il set di risorse per la cultura neutra da un assembly specifico. Anche se l'eccezione viene generata quando si tenta di recuperare una determinata risorsa, è causato dall'errore di caricare il set di risorse anziché dall'errore di trovare la risorsa.

Nota

Per ulteriori informazioni, consultare la sezione intitolata "Gestione di un'eccezione MissingManifestResourceException" nel tema della classe ResourceManager.

Le cause principali dell'eccezione includono quanto segue:

  • Il set di risorse non è identificato dal nome completo. Ad esempio, se il parametro baseName nella chiamata al metodo ResourceManager.ResourceManager(String, Assembly) specifica il nome radice del set di risorse senza uno spazio dei nomi, ma al set di risorse viene assegnato uno spazio dei nomi quando viene archiviato nell'assembly, la chiamata al metodo ResourceManager.GetString genera questa eccezione.

    Se hai incorporato il file con estensione .resources, che contiene le risorse della cultura predefinita, nel tuo eseguibile e la tua app genera un MissingManifestResourceException, è possibile utilizzare uno strumento di reflection, come ad esempio il Disassembler IL (Ildasm.exe), per determinare il nome completo della risorsa. In ILDasm, fai doppio clic sull'etichetta eseguibile MANIFEST per aprire la finestra MANIFEST. Le risorse vengono visualizzate come elementi .mresource e vengono elencate dopo i riferimenti all'assembly esterno e gli attributi a livello di assembly personalizzati. È anche possibile compilare l'utilità semplice seguente, che elenca i nomi completi delle risorse incorporate nell'assembly il cui nome viene passato come parametro della riga di comando.

    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
    
  • È possibile identificare il set di risorse in base al nome del file di risorse (insieme allo spazio dei nomi facoltativo) e all'estensione del file anziché in base allo spazio dei nomi e al nome del file radice. Ad esempio, questa eccezione viene generata se il set di risorse della cultura neutra è denominato GlobalResources e si specifica un valore di GlobalResources.resources invece di GlobalResourcesnel parametro baseName del costruttore ResourceManager.ResourceManager(String, Assembly).

  • Non è possibile trovare il set di risorse specifico della cultura identificato tramite una chiamata di metodo e non si può caricare il set di risorse di fallback. Ad esempio, se crei assembly satellite per le culture inglese (Stati Uniti) e russo (Russia), ma non fornisci un set di risorse per la cultura neutra, questa eccezione viene generata se la cultura corrente dell'app è inglese (Regno Unito).

L'HRESULT COR_E_MISSINGMANIFESTRESOURCEviene utilizzato da MissingManifestResourceException e ha il valore 0x80131532.

MissingManifestResourceException usa l'implementazione di Equals predefinita, che supporta l'uguaglianza dei riferimenti.

Per un elenco dei valori iniziali delle proprietà per un'istanza di MissingManifestResourceException, consultare i costruttori di MissingManifestResourceException.

Nota

Ti consigliamo di includere un set neutro di risorse nell'assembly principale, quindi l'app non avrà esito negativo se un assembly satellite non è disponibile.

App della piattaforma universale di Windows (UWP)

Le app UWP distribuiscono risorse per più culture, inclusa la cultura neutra, in un unico file di indice delle risorse del pacchetto (.pri). Di conseguenza, in un'app UWP, se non è possibile trovare risorse per la cultura preferita, il MissingManifestResourceException viene lanciato in una delle condizioni seguenti:

  • L'app non include un file con estensione pri o non è stato possibile aprire il file pri.
  • Il file .pri dell'applicazione non contiene un set di risorse per il nome radice specificato.