Udostępnij za pośrednictwem


Klasa System.Resources.MissingManifestResourceException

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Wyjątek MissingManifestResourceException jest zgłaszany z różnych powodów w aplikacjach platformy .NET i platformy UWP.

Aplikacje platformy .NET

W aplikacjach platformy .NET MissingManifestResourceException jest zgłaszana, gdy próba pobrania zasobu nie powiedzie się, ponieważ zbioru zasobów dla kultury neutralnej nie można załadować z określonego zestawu. Chociaż wyjątek jest zgłaszany podczas próby pobrania określonego zasobu, jest spowodowany niepowodzeniem załadowania zestawu zasobów, a nie niepowodzeniem znalezienia zasobu.

Uwaga

Aby uzyskać dodatkowe informacje, zobacz sekcję "Obsługa wyjątku MissingManifestResourceException" w zagadnieniu dotyczącym klasy ResourceManager.

Główne przyczyny wyjątku obejmują następujące elementy:

  • Zestaw zasobów nie jest identyfikowany przez jego w pełni kwalifikowaną nazwę. Jeśli na przykład parametr baseName w wywołaniu metody ResourceManager.ResourceManager(String, Assembly) określa nazwę główną zestawu zasobów bez przestrzeni nazw, ale zestaw zasobów jest przypisany do przestrzeni nazw, gdy jest przechowywany w zestawie, wywołanie metody ResourceManager.GetString zgłasza ten wyjątek.

    Jeśli osadzono plik .resources zawierający zasoby kultury domyślnej w pliku wykonywalnym, a aplikacja zgłasza MissingManifestResourceException, możesz użyć narzędzia do refleksji, takiego jak dezasembler IL (IL Disassembler) (Ildasm.exe), w celu określenia w pełni kwalifikowanej nazwy zasobu. W ILDasm, kliknij dwukrotnie etykietę MANIFEST pliku wykonywalnego, aby otworzyć okno MANIFEST. Zasoby pojawiają się jako elementy .mresource i są wymienione po odwołaniach do zestawów zewnętrznych oraz niestandardowych atrybutach poziomu zestawu. Można również skompilować następujące proste narzędzie, które wyświetla w pełni kwalifikowane nazwy zasobów osadzonych w zestawie, którego nazwa jest przekazywana do niego jako parametr wiersza polecenia.

    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
    
  • Można zidentyfikować zestaw zasobów według nazwy pliku zasobu (wraz z opcjonalną przestrzenią nazw) i jego rozszerzeniem pliku, a nie przez samą przestrzeń nazw i nazwę pliku głównego. Na przykład ten wyjątek jest zgłaszany, jeśli zestaw zasobów neutralnej kultury ma nazwę GlobalResources i podajesz wartość GlobalResources.resources (zamiast GlobalResources) do parametru baseName konstruktora ResourceManager.ResourceManager(String, Assembly).

  • Nie można odnaleźć zestawu zasobów specyficznych dla kultury zidentyfikowanego w wywołaniu metody i nie można załadować zestawu zasobów rezerwowych. Jeśli na przykład utworzysz zestawy satelitarne dla kultur angielskiej (Stany Zjednoczone) i rosyjskiej (Rosja), ale nie podasz zestawu zasobów dla neutralnej kultury, ten wyjątek jest zgłaszany, jeśli bieżącą kulturą aplikacji jest angielska (Wielka Brytania).

MissingManifestResourceException używa HRESULT COR_E_MISSINGMANIFESTRESOURCE, który ma wartość 0x80131532.

MissingManifestResourceException używa domyślnej implementacji Equals, która obsługuje równość odwołań.

Aby uzyskać listę początkowych wartości właściwości dla wystąpienia MissingManifestResourceException, zapoznaj się z konstruktorami MissingManifestResourceException.

Uwaga

Zalecamy uwzględnienie neutralnego zestawu zasobów w zestawie głównym, więc aplikacja nie powiedzie się, jeśli zestaw satelitarny jest niedostępny.

Aplikacje platformy uniwersalnej systemu Windows (UWP)

Aplikacje UWP umożliwiają zasoby dla wielu kultur, w tym neutralnej kultury, w jednym pliku indeksu zasobów pakietu (.pri). W związku z tym w aplikacji UWP (Uniwersalna platforma Windows), jeśli nie można odnaleźć zasobów preferowanej kultury, MissingManifestResourceException jest zgłaszany w jednym z następujących warunków:

  • Aplikacja nie zawiera pliku pri lub nie można otworzyć pliku pri.
  • Plik pri aplikacji nie zawiera zestawu zasobów dla danej nazwy głównej.