다음을 통해 공유


System.Resources.ResourceManager 생성자

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

ResourceManager(Type) 생성자

이 섹션은 생성자 오버로드와 ResourceManager(Type) 관련이 있습니다.

데스크톱 앱

데스크톱 앱에서 리소스 관리자는 매개 변수를 resourceSource 사용하여 다음과 같이 특정 리소스 파일을 로드합니다.

  • NeutralResourcesLanguageAttribute 기본 문화권의 리소스가 위성 어셈블리에 있음을 나타내는 데 특성을 사용하지 않는 경우 Resource Manager는 기본 문화권의 리소스 파일이 매개 변수에 지정된 resourceSource 형식과 동일한 어셈블리에 있다고 가정합니다.
  • 리소스 관리자는 기본 리소스 파일이 매개 변수에 지정된 형식과 동일한 기본 이름을 가지고 있다고 resourceSource 가정합니다.
  • 리소스 관리자는 기본 ResourceSet 클래스를 사용하여 리소스 파일을 조작합니다.

예를 들어 이름이 지정된 MyCompany.MyProduct.MyType형식이 지정된 경우 리소스 관리자는 정의하는 어셈블리에서 MyCompany.MyProduct.MyType.resources라는 .resources 파일을 찾습니다MyType.

Visual Studio에서 리소스 디자이너는 기본 문화권에 대한 .resources internal 파일의 기본 이름과 이름이 같은 (C#) 또는 Friend (Visual Basic에서) 클래스를 정의하는 코드를 자동으로 생성합니다. 이렇게 하면 클래스가 컴파일러에 표시되는 한 리소스도 표시되어야 하므로 이름이 리소스 이름에 해당하는 형식 개체를 가져오면 개체를 인스턴스화 ResourceManager 하고 특정 리소스 집합과 결합할 수 있습니다. 예를 들어 .resources 파일 이름이 Resource1인 경우 다음 문은 Resource1이라는 .resources 파일을 관리하기 위해 개체를 인스턴스화 ResourceManager 합니다.

ResourceManager rm = new ResourceManager(typeof(Resource1));

Visual Studio를 사용하지 않는 경우 네임스페이스와 이름이 기본 .resources 파일과 동일한 멤버가 없는 클래스를 만들 수 있습니다 . 예제에서는 그림을 제공합니다.

Windows 8.x 앱

Important

클래스는 ResourceManager Windows 8.x 앱에서 지원되지만 사용하지 않는 것이 좋습니다. Windows 8.x 앱에서 사용할 수 있는 이식 가능한 클래스 라이브러리 프로젝트를 개발하는 경우에만 이 클래스를 사용합니다. Windows 8.x 앱에서 리소스를 검색하려면 Windows.ApplicationModel.Resources.ResourceLoader 클래스를 대신 사용합니다.

Windows 8.x 앱 ResourceManager 에서 매개 변수를 사용하여 resourceSource 어셈블리, 기본 이름 및 리소스 항목이 앱의 PRI(패키지 리소스 인덱스) 파일 내에 있을 수 있는 네임스페이스를 유추합니다. 예를 들어 정의된 형식 MyCompany.MyProduct.MyTypeMyAssembly지정된 경우 리소스 관리자는 이름이 지정된 MyAssembly 리소스 집합 식별자를 찾고 해당 리소스 집합 내에서 범위를 MyCompany.MyProduct.MyType 찾습니다. 리소스 관리자는 이 범위 내에서 기본 컨텍스트(현재 문화권, 현재 고대비 설정 등)에서 리소스 항목을 검색합니다.

예시

다음 예제에서는 생성자를 사용하여 ResourceManager(Type) 개체를 인스턴스화합니다 ResourceManager . 영어(en), 프랑스어(프랑스)(fr-FR) 및 러시아어(러시아)(ru-RU) 문화권에 대한 .txt 파일에서 컴파일된 리소스로 구성됩니다. 이 예제에서는 현재 문화권과 현재 UI 문화권을 영어(미국), 프랑스어(프랑스), 러시아어(러시아) 및 스웨덴어(스웨덴)로 변경합니다. 그런 다음, 메서드를 GetString(String) 호출하여 현지화된 문자열을 검색합니다. 이 문자열은 하루 중 시간에 따라 인사말을 표시합니다.

이 예제에서는 다음 표에 나열된 대로 세 개의 텍스트 기반 리소스 파일이 필요합니다. 각 파일에는 이름이 인 MorningAfternoon문자열 리소스 및 Evening.

문화권 File name 리소스 이름 리소스 값
en-US GreetingResources.txt Morning 안녕하세요.
en-US GreetingResources.txt Afternoon 안녕하세요
en-US GreetingResources.txt Evening 안녕하세요.
fr-FR GreetingResources.fr-FR.txt Morning Bonjour
fr-FR GreetingResources.fr-FR.txt Afternoon Bonjour
fr-FR GreetingResources.fr-FR.txt Evening 본소이르 주
ru-RU GreetingResources.ru-RU.txt Morning Доброе утро
ru-RU GreetingResources.ru-RU.txt Afternoon Добрый день
ru-RU GreetingResources.ru-RU.txt Evening Добрый вечер

다음 일괄 처리 파일을 사용하여 Visual Basic 예제를 컴파일하고 Greet.exe 실행 파일을 만들 수 있습니다. C#으로 컴파일하려면 컴파일러 이름을 에서 cscvbc 파일 확장명으로 .vb 변경합니다.cs.

resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources

md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources

md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources

다음은 예제의 소스 코드입니다(Visual Basic 버전에 대한 ShowDate.vb 또는 코드의 C# 버전에 대한 ShowDate.cs).

using System;
using System.Resources;
using System.Globalization;
using System.Threading;

[assembly: NeutralResourcesLanguage("en")]

public class Example2
{
    public static void Main()
    {
        string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
        DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                     DateTime.Now.Day, 12, 0, 0);
        DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                        DateTime.Now.Day, 18, 0, 0);

        ResourceManager rm = new ResourceManager(typeof(GreetingResources));

        foreach (var cultureName in cultureNames)
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
            Console.WriteLine("The current UI culture is {0}",
                              CultureInfo.CurrentUICulture.Name);
            if (DateTime.Now < noon)
                Console.WriteLine("{0}!", rm.GetString("Morning"));
            else if (DateTime.Now < evening)
                Console.WriteLine("{0}!", rm.GetString("Afternoon"));
            else
                Console.WriteLine("{0}!", rm.GetString("Evening"));
            Console.WriteLine();
        }
    }

    internal class GreetingResources
    {
    }
}
// The example displays output like the following:
//       The current UI culture is en-US
//       Good afternoon!
//
//       The current UI culture is fr-FR
//       Bonjour!
//
//       The current UI culture is ru-RU
//       Добрый день!
//
//       The current UI culture is sv-SE
//       Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim noon As New Date(Date.Now.Year, Date.Now.Month, 
                           Date.Now.Day, 12,0,0)
      Dim evening As New Date(Date.Now.Year, Date.Now.Month,
                              Date.Now.Day, 18, 0, 0)                          
      
      Dim rm As New ResourceManager(GetType(GreetingResources))
      
      For Each cultureName In cultureNames
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current UI culture is {0}", 
                           CultureInfo.CurrentUICulture.Name)
         If Date.Now < noon Then
            Console.WriteLine("{0}!", rm.GetString("Morning"))
         ElseIf Date.Now < evening Then
            Console.WriteLine("{0}!", rm.GetString("Afternoon"))
         Else
            Console.WriteLine("{0}!", rm.GetString("Evening"))
         End If 
         Console.WriteLine()
      Next
   End Sub
End Module

Friend Class GreetingResources
End Class
' The example displays output like the following:
'       The current UI culture is en-US
'       Good afternoon!
'       
'       The current UI culture is fr-FR
'       Bonjour!
'       
'       The current UI culture is ru-RU
'       Добрый день!
'       
'       The current UI culture is sv-SE
'       Good afternoon!

소스 코드는 명명 Example된 앱 클래스를 정의하는 것 외에도 이름이 GreetingResources리소스 파일의 기본 이름과 동일한 내부 클래스를 정의합니다. 이렇게 하면 생성자를 호출하여 개체를 ResourceManager 성공적으로 인스턴스화할 ResourceManager(Type) 수 있습니다.

현재 UI 문화권이 스웨덴어(스웨덴)인 경우를 제외하고 출력에 적절한 지역화된 문자열이 표시됩니다. 이 경우 영어 리소스를 사용합니다. 스웨덴어 언어 리소스를 사용할 수 없으므로 앱은 특성에 정의된 기본 문화권의 리소스를 NeutralResourcesLanguageAttribute 대신 사용합니다.

ResourceManager(String, Assembly) 생성자

이 섹션은 생성자 오버로드와 ResourceManager(String, Assembly) 관련이 있습니다.

데스크톱 앱

데스크톱 앱에서 개별 문화권별 리소스 파일은 위성 어셈블리에 포함되어야 하며 기본 문화권의 리소스 파일은 기본 어셈블리에 포함되어야 합니다. 위성 어셈블리는 해당 어셈블리의 매니페스트에 지정된 단일 문화권에 대한 리소스를 포함하는 것으로 간주되며 필요에 따라 로드됩니다.

참고 항목

어셈블리에서 리소스를 검색하는 대신 .resources 파일에서 직접 리소스를 검색하려면 개체를 인스턴스화하는 대신 메서드를 ResourceManager 호출 CreateFileBasedResourceManager 해야 합니다.

식별된 baseName 리소스 파일을 찾을 assembly수 없는 경우 메서드는 개체를 ResourceManager 인스턴스화하지만 특정 리소스를 검색하려고 하면 일반적으로 MissingManifestResourceException예외가 발생합니다. 예외의 원인을 진단하는 방법에 대한 자세한 내용은 클래스 항목의 "MissingManifestResourceException 예외 처리" 섹션을 ResourceManager 참조하세요.

Windows 8.x 앱

Important

클래스는 ResourceManager Windows 8.x 앱에서 지원되지만 사용하지 않는 것이 좋습니다. Windows 8.x 앱에서 사용할 수 있는 이식 가능한 클래스 라이브러리 프로젝트를 개발하는 경우에만 이 클래스를 사용합니다. Windows 8.x 앱에서 리소스를 검색하려면 Windows.ApplicationModel.Resources.ResourceLoader 클래스를 대신 사용합니다.

Windows 8.x 앱에서 리소스 관리자는 매개 변수의 assembly 간단한 이름을 사용하여 앱의 PRI(패키지 리소스 인덱스) 파일에서 일치하는 리소스 집합을 조회합니다. baseName 매개 변수는 리소스 집합 내에서 리소스 항목을 조회하는 데 사용됩니다. 예를 들어 PortableLibrary1.Resource1.de-DE.resources의 루트 이름은 PortableLibrary1.Resource1입니다.

예시

다음 예제에서는 지역화되지 않은 간단한 "헬로 월드" 앱을 사용하여 생성자를 보여 ResourceManager(String, Assembly) 줍니다. ExampleResources.txt 텍스트 파일의 내용입니다Greeting=Hello. 앱이 컴파일되면 리소스가 기본 앱 어셈블리에 포함됩니다.

다음과 같이 명령 프롬프트에서 ResGen.exe(리소스 파일 생성기)를 사용하여 텍스트 파일을 이진 리소스 파일로 변환할 수 있습니다.

resgen ExampleResources.txt

다음 예제에서는 개체를 인스턴스화 ResourceManager 하고 사용자에게 이름을 입력하라는 메시지를 표시하고 인사말을 표시하는 실행 코드를 제공합니다.

using System;
using System.Reflection;
using System.Resources;

public class Example1
{
    public static void Main()
    {
        // Retrieve the resource.
        ResourceManager rm = new ResourceManager("ExampleResources",
                                 typeof(Example).Assembly);
        string greeting = rm.GetString("Greeting");

        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        Console.WriteLine("{0} {1}!", greeting, name);
    }
}
// The example produces output similar to the following:
//       Enter your name: John
//       Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources

Module Example1
    Public Sub Main()
        ' Retrieve the resource.
        Dim rm As New ResourceManager("ExampleResources",
                                      GetType(Example).Assembly)
        Dim greeting As String = rm.GetString("Greeting")

        Console.Write("Enter your name: ")
        Dim name As String = Console.ReadLine()
        Console.WriteLine("{0} {1}!", greeting, name)
    End Sub
End Module
' The example produces output similar to the following:
'       Enter your name: John
'       Hello John!

C#에서 다음 명령을 사용하여 컴파일할 수 있습니다.

csc Example.cs /resource:ExampleResources.resources

이 예제에서는 해당 어셈블리에 정의된 형식을 함수(C#) 또는 GetType 함수(Visual Basic)에 전달하고 해당 Type.Assembly 속성 값을 검색하여 리소스 파일이 포함된 어셈블리 typeof 에 대한 참조를 검색합니다.