System.Resources.MissingManifestResourceException – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

V MissingManifestResourceException .NET a aplikacích pro UPW se vyvolá výjimka z různých důvodů.

Aplikace .NET

V aplikacích .NET se vyvolá, když se pokus o načtení prostředku nezdaří, MissingManifestResourceException protože sadu prostředků pro neutrální jazykovou verzi nelze načíst z konkrétního sestavení. I když je výjimka vyvolána při pokusu o načtení konkrétního prostředku, příčinou je selhání načtení sady prostředků, nikoli selhání nalezení prostředku.

Poznámka:

Další informace najdete v části Zpracování výjimky MissingManifestResourceException v ResourceManager tématu třídy.

Mezi hlavní příčiny výjimky patří:

  • Sada prostředků není identifikovaná plně kvalifikovaným názvem. Pokud například baseName parametr volání ResourceManager.ResourceManager(String, Assembly) metody určuje kořenový název sady prostředků bez oboru názvů, ale sada prostředků je přiřazena obor názvů, když je uložen v jeho sestavení, volání ResourceManager.GetString metody vyvolá tuto výjimku.

    Pokud jste do spustitelného souboru vloženého souboru .resources, který obsahuje výchozí prostředky jazykové verze, a aplikace vyvolá výjimku MissingManifestResourceException, můžete použít nástroj reflexe, jako je il Disassembler (Ildasm.exe), a určit tak plně kvalifikovaný název prostředku. V nástroji ILDasm poklikejte na popisek manifestu spustitelného souboru a otevřete okno MANIFESTu. Prostředky se zobrazují jako .mresource položky a jsou uvedeny za odkazy na externí sestavení a vlastní atributy na úrovni sestavení. Můžete také zkompilovat následující jednoduchý nástroj, který vypíše plně kvalifikované názvy vložených prostředků v sestavení, jehož název je předán jako parametr příkazového řádku.

    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
    
  • Prostředek nastavený podle názvu souboru prostředku (spolu s jeho volitelným oborem názvů) a jeho příponou souboru, nikoli jeho oborem názvů a názvem kořenového souboru. Tato výjimka je vyvolána například v případě, že je sada prostředků neutrální jazykové verze pojmenována GlobalResources a zadáte hodnotu GlobalResources.resources (místo GlobalResources) baseName parametru konstruktoru ResourceManager.ResourceManager(String, Assembly) .

  • Nelze najít sadu prostředků specifickou pro jazykovou verzi, která je identifikována voláním metody a nelze načíst záložní sadu prostředků. Pokud například vytváříte satelitní sestavení pro jazykové verze angličtiny (USA) a Ruska (ruština), ale nemůžete poskytnout sadu prostředků pro neutrální jazykovou verzi, vyvolá se tato výjimka, pokud je aktuální jazyková verze vaší aplikace angličtina (Spojené království).

MissingManifestResourceException používá HODNOTU HRESULT COR_E_MISSINGMANIFESTRESOURCE, která má hodnotu 0x80131532.

MissingManifestResourceException používá výchozí Equals implementaci, která podporuje rovnost odkazů.

Seznam počátečních hodnot vlastností pro instanci MissingManifestResourceExceptionnaleznete v MissingManifestResourceException konstruktorech.

Poznámka:

Doporučujeme do hlavního sestavení zahrnout neutrální sadu prostředků, takže pokud není k dispozici satelitní sestavení, nebude aplikace neúspěšná.

aplikace pro Univerzální platforma Windows (UPW)

Aplikace pro UPW nasazují prostředky pro více jazykových verzí, včetně neutrální jazykové verze, do jednoho souboru indexu prostředků balíčku (.pri). V aplikaci pro UPW se proto v případě, že se nepodařilo najít prostředky pro upřednostňovanou jazykovou verzi, MissingManifestResourceException vyvolá se za některé z následujících podmínek:

  • Aplikace neobsahuje soubor .pri nebo soubor .pri nelze otevřít.
  • Soubor .pri aplikace neobsahuje sadu prostředků pro daný kořenový název.