System.Resources.MissingManifestResourceException-klass

Anmärkning

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

Ett MissingManifestResourceException undantag utlöses av olika orsaker i .NET jämfört med UWP-appar.

.NET-appar

I .NET-appar genereras MissingManifestResourceException när försöket att hämta en resurs misslyckas eftersom resursuppsättningen för den neutrala kulturen inte kunde läsas in från en viss sammansättning. Även om undantaget utlöses när du försöker hämta en viss resurs orsakas det av att resursuppsättningen inte kunde läsas in i stället för att resursen inte kunde hittas.

Anmärkning

Mer information finns i avsnittet "Hantera ett MissingManifestResourceException-undantag" i avsnittet ResourceManager klass.

De främsta orsakerna till undantaget är följande:

  • Resursuppsättningen identifieras inte med dess fullständigt kvalificerade namn. Om parametern baseName i anropet till metoden ResourceManager.ResourceManager(String, Assembly) anger rotnamnet för resursuppsättningen utan namnområde, men resursuppsättningen tilldelas ett namnområde när den lagras i sammansättningen, utlöser anropet till metoden ResourceManager.GetString det här undantaget.

    Om du har bäddat in .resources-filen som innehåller standardkulturens resurser i den körbara filen och appen genererar en MissingManifestResourceExceptionkan du använda ett reflektionsverktyg som IL Disassembler (Ildasm.exe) för att fastställa resursens fullständigt kvalificerade namn. I ILDasm dubbelklickar du på den körbara manifestetiketten för att öppna fönstret MANIFEST. Resurser visas som .mresource-poster och listas efter externa samlingsreferenser och anpassade attribut på samlingsnivå. Du kan också kompilera följande enkla verktyg, som visar de fullständigt kvalificerade namnen på inbäddade resurser i sammansättningen vars namn skickas till den som en kommandoradsparameter.

    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
    
  • Du identifierar resursen som angetts med dess resursfilnamn (tillsammans med dess valfria namnområde) och filnamnstillägget i stället för enbart dess namnområde och rotfilnamn. Det här undantaget utlöses till exempel om den neutrala kulturens resursuppsättning heter GlobalResources och du anger värdet GlobalResources.resources (i stället för GlobalResources) till parametern baseName för ResourceManager.ResourceManager(String, Assembly) konstruktorn.

  • Det går inte att hitta den kulturspecifika resursuppsättning som identifieras i ett metodanrop och återställningsresursuppsättningen kan inte läsas in. Om du till exempel skapar satellitsammansättningar för de engelska (USA) och Ryssland (ryska) kulturerna, men du inte kan tillhandahålla en resursuppsättning för den neutrala kulturen, utlöses det här undantaget om appens aktuella kultur är engelska (Storbritannien).

MissingManifestResourceException använder HRESULT-COR_E_MISSINGMANIFESTRESOURCE, som har värdet 0x80131532.

MissingManifestResourceException använder standardimplementeringen Equals, som stöder referensjämlikhet.

För en lista över inledande egenskapsvärden för en instans av MissingManifestResourceException, se i MissingManifestResourceException-konstruktorn.

Anmärkning

Vi rekommenderar att du inkluderar en neutral uppsättning resurser i huvudsammansättningen, så att appen inte misslyckas om en satellituppsättning inte är tillgänglig.

UWP-appar (Universal Windows Platform)

UWP-appar distribuerar resurser för flera kulturer, inklusive den neutrala kulturen, i en enda paketresursindexfil (.pri). Om det inte går att hitta resurser för den föredragna kulturen i en UWP-app genereras därför MissingManifestResourceException under något av följande villkor:

  • Appen innehåller inte en .pri-fil eller så gick det inte att öppna .pri-filen.
  • Appens .pri-fil innehåller inte någon resursuppsättning för det angivna rotnamnet.