다음을 통해 공유


System.Resources.MissingManifestResourceException 클래스

이 문서는 이 API에 대한 참조 설명서를 보충하는 추가 설명을 제공합니다.

.NET과 UWP 앱에서는 각각 다른 이유로 MissingManifestResourceException 예외가 발생합니다.

.NET 앱

.NET 앱에서는 특정 어셈블리에서 중립 문화권에 대한 리소스 집합을 로드할 수 없기 때문에 리소스 검색 시도가 실패할 때 MissingManifestResourceException이 throw됩니다. 특정 리소스를 검색하려고 할 때 예외가 throw되지만 리소스를 찾지 못한 것이 아니라 리소스 집합을 로드하지 못하여 발생합니다.

비고

자세한 내용은 ResourceManager 클래스 항목의 "MissingManifestResourceException 예외 처리" 섹션을 참조하세요.

예외의 주요 원인은 다음과 같습니다.

  • 리소스 집합은 정규화된 이름으로 식별되지 않습니다. 예를 들어 baseName 메서드 호출의 ResourceManager.ResourceManager(String, Assembly) 매개 변수가 네임스페이스가 없는 리소스 집합의 루트 이름을 지정하지만 리소스 집합이 어셈블리에 저장될 때 네임스페이스가 할당되는 경우 ResourceManager.GetString 메서드를 호출하면 이 예외가 throw됩니다.

    실행 파일에 기본 문화권의 리소스가 포함된 .resources 파일을 포함했으며, 앱이 MissingManifestResourceException오류를 발생시키는 경우, IL 디스어셈블러(Ildasm.exe) 같은 리플렉션 도구를 사용하여 리소스의 전체 이름을 확인할 수 있습니다. ILDasm에서 실행 파일의 MANIFEST 레이블을 두 번 클릭하여 MANIFEST 창을 엽니다. 리소스는 .mresource 항목으로 표시되며 외부 어셈블리 참조 및 사용자 지정 어셈블리 수준 특성 후에 나열됩니다. 명령줄 매개 변수로 이름이 전달되는 어셈블리에 포함된 리소스의 정규화된 이름을 나열하는 다음 간단한 유틸리티를 컴파일할 수도 있습니다.

    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
    
  • 리소스 집합은 해당 네임스페이스 및 루트 파일 이름만 사용하는 것이 아니라 해당 리소스 파일 이름(선택적 네임스페이스와 함께)과 해당 파일 확장명을 사용하여 식별합니다. 예를 들어, 중립 문화권의 리소스 집합이 GlobalResources으로 명명되고 GlobalResources.resources 생성자의 GlobalResources 매개변수에 baseName대신 ResourceManager.ResourceManager(String, Assembly) 값을 제공하는 경우, 이 예외가 발생합니다.

  • 메서드 호출에서 식별된 문화권별 리소스 집합을 찾을 수 없으며 대체 리소스 집합을 로드할 수 없습니다. 예를 들어 영어(미국) 및 러시아(러시아어) 문화권에 대한 위성 어셈블리를 만들지만 중립 문화권에 대한 리소스 집합을 제공하지 못하는 경우 앱의 현재 문화권이 영어(영국)인 경우 이 예외가 throw됩니다.

MissingManifestResourceException는 값이 0x80131532인 HRESULT COR_E_MISSINGMANIFESTRESOURCE을 사용합니다.

MissingManifestResourceException 참조 같음을 지원하는 기본 Equals 구현을 사용합니다.

MissingManifestResourceException인스턴스의 초기 속성 값 목록은 MissingManifestResourceException 생성자를 참조하세요.

비고

위성 어셈블리를 사용할 수 없는 경우 앱이 실패하지 않도록 주 어셈블리에 중립 리소스 집합을 포함하는 것이 좋습니다.

UWP(유니버설 Windows 플랫폼) 앱

UWP 앱은 중립 문화권을 포함한 여러 문화권에 대한 리소스를 단일 패키지 리소스 인덱스(.pri) 파일에 배포합니다. 따라서 UWP 앱에서 기본 문화권에 대한 리소스를 찾을 수 없는 경우, MissingManifestResourceException 오류가 다음 조건 중 하나에서 발생합니다.

  • 앱에 .pri 파일이 없거나 .pri 파일을 열 수 없습니다.
  • 앱의 .pri 파일에는 지정된 루트 이름에 대한 리소스 집합이 포함되어 있지 않습니다.