Share via


System.Resources.ResourceManager.GetObject 메서드

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

GetObject 메서드는 문자열이 아닌 리소스를 검색하는 데 사용됩니다. 여기에는 비트맵(예: Int32 개체) 또는 Double사용자 지정 직렬화된 개체와 같은 기본 데이터 형식에 System.Drawing.Bitmap 속하는 값이 포함됩니다. 일반적으로 반환된 개체는 C#으로 캐스팅되거나(Visual Basic에서) 적절한 형식의 개체로 변환되어야 합니다.

이 속성은 IgnoreCase 리소스 이름과의 name 비교가 대/소문자를 구분하지 않는지 또는 대/소문자를 구분하는지 여부를 결정합니다(기본값).

참고 항목

이러한 메서드는 나열된 것보다 더 많은 예외를 throw할 수 있습니다. 이 문제가 발생할 수 있는 한 가지 이유는 이 메서드가 호출하는 메서드가 예외를 throw하는 경우입니다. 예를 들어 FileLoadException 위성 어셈블리를 배포하거나 설치하는 동안 오류가 발생하면 예외가 throw되거나, SerializationException 형식이 역직렬화될 때 사용자 정의 형식이 사용자 정의 예외를 throw하는 경우 예외가 throw될 수 있습니다.

GetObject(String) 메서드

반환된 리소스는 속성에 의해 정의된 현재 스레드의 UI 문화권에 대해 CultureInfo.CurrentUICulture 지역화됩니다. 리소스가 해당 문화권에 대해 지역화되지 않은 경우 리소스 관리자는 대체 규칙을 사용하여 적절한 리소스를 로드합니다. 사용할 수 있는 지역화된 리소스 집합이 ResourceManager 없으면 기본 문화권의 리소스가 반환됩니다. 기본 문화권에 대한 리소스 집합을 찾을 수 없는 경우 메서드는 예외를 MissingManifestResourceException throw하거나, 리소스 집합이 위성 어셈블리에 상주해야 하는 경우 예외를 MissingSatelliteAssemblyException throw합니다. 리소스 관리자가 적절한 리소스 집합을 로드할 수 있지만 이름이 지정된 name리소스를 찾을 수 없는 경우 메서드가 반환됩니다 null.

예시

다음 예제에서는 GetObject(String) 메서드를 사용하여 사용자 지정 개체를 역직렬화합니다. 이 예제에는 다음 구조체를 정의하는 UIElements.cs(Visual Basic을 사용하는 경우 UIElements.vb)라는 PersonTable소스 코드 파일이 포함되어 있습니다. 이 구조는 테이블 열의 지역화된 이름을 표시하는 일반 테이블 표시 루틴에서 사용하기 위한 것입니다. PersonTable 구조체는 SerializableAttribute 특성으로 표시됩니다.

using System;

[Serializable] public struct PersonTable
{
   public readonly int nColumns;
   public readonly string column1;
   public readonly string column2;
   public readonly string column3;
   public readonly int width1;
   public readonly int width2;
   public readonly int width3;

   public PersonTable(string column1, string column2, string column3,
                  int width1, int width2, int width3)
   {
      this.column1 = column1;
      this.column2 = column2;
      this.column3 = column3;
      this.width1 = width1;
      this.width2 = width2;
      this.width3 = width3;
      this.nColumns = typeof(PersonTable).GetFields().Length / 2;
   }
}
<Serializable> Public Structure PersonTable1
    Public ReadOnly nColumns As Integer
    Public ReadOnly column1 As String
    Public ReadOnly column2 As String
    Public ReadOnly column3 As String
    Public ReadOnly width1 As Integer
    Public ReadOnly width2 As Integer
    Public ReadOnly width3 As Integer

    Public Sub New(column1 As String, column2 As String, column3 As String,
                  width1 As Integer, width2 As Integer, width3 As Integer)
        Me.column1 = column1
        Me.column2 = column2
        Me.column3 = column3
        Me.width1 = width1
        Me.width2 = width2
        Me.width3 = width3
        Me.nColumns = Me.GetType().GetFields().Count \ 2
    End Sub
End Structure

CreateResources.cs(또는 Visual Basic용 CreateResources.vb)라는 파일의 다음 코드는 테이블 제목과 PersonTable 영어로 지역화된 앱에 대한 정보를 포함하는 개체를 저장하는 UIResources.resx라는 XML 리소스 파일을 만듭니다.

using System;
using System.Resources;

public class CreateResource
{
   public static void Main()
   {
      PersonTable table = new PersonTable("Name", "Employee Number",
                                          "Age", 30, 18, 5);
      ResXResourceWriter rr = new ResXResourceWriter(@".\UIResources.resx");
      rr.AddResource("TableName", "Employees of Acme Corporation");
      rr.AddResource("Employees", table);
      rr.Generate();
      rr.Close();
   }
}
Imports System.Resources

Module CreateResource1
    Public Sub Main()
        Dim table As New PersonTable("Name", "Employee Number", "Age", 30, 18, 5)
        Dim rr As New ResXResourceWriter(".\UIResources.resx")
        rr.AddResource("TableName", "Employees of Acme Corporation")
        rr.AddResource("Employees", table)
        rr.Generate()
        rr.Close()
    End Sub
End Module

GetObject.cs(또는 GetObject.vb)라는 소스 코드 파일의 다음 코드는 리소스를 검색하여 콘솔에 표시합니다.

using System;
using System.Resources;

[assembly: NeutralResourcesLanguageAttribute("en")]

public class Example3
{
   public static void Main()
   {
      string fmtString = String.Empty;
      ResourceManager rm = new ResourceManager("UIResources", typeof(Example).Assembly);
      string title = rm.GetString("TableName");
      PersonTable tableInfo = (PersonTable) rm.GetObject("Employees");

      if (! String.IsNullOrEmpty(title)) {
         fmtString = "{0," + ((Console.WindowWidth + title.Length) / 2).ToString() + "}";
         Console.WriteLine(fmtString, title);
         Console.WriteLine();
      }

      for (int ctr = 1; ctr <= tableInfo.nColumns; ctr++) {
         string columnName = "column"  + ctr.ToString();
         string widthName = "width" + ctr.ToString();
         string value = tableInfo.GetType().GetField(columnName).GetValue(tableInfo).ToString();
         int width = (int) tableInfo.GetType().GetField(widthName).GetValue(tableInfo);
         fmtString = "{0,-" + width.ToString() + "}";
         Console.Write(fmtString, value);
      }
      Console.WriteLine();
   }
}
Imports System.Resources

<Assembly: NeutralResourcesLanguageAttribute("en")>

Module Example
   Public Sub Main()
      Dim fmtString As String = String.Empty
      Dim rm As New ResourceManager("UIResources", GetType(Example).Assembly)       
      Dim title As String = rm.GetString("TableName")
      Dim tableInfo As PersonTable = DirectCast(rm.GetObject("Employees"), PersonTable)

      If Not String.IsNullOrEmpty(title) Then
         fmtString = "{0," + ((Console.WindowWidth + title.Length) \ 2).ToString() + "}" 
         Console.WriteLine(fmtString, title)      
         Console.WriteLine()
      End If

      For ctr As Integer = 1 To tableInfo.nColumns
         Dim columnName As String = "column"  + ctr.ToString()
         Dim widthName As String = "width" + ctr.ToString()
         Dim value As String = CStr(tableInfo.GetType().GetField(columnName).GetValue(tableInfo))
         Dim width As Integer = CInt(tableInfo.GetType().GetField(widthName).GetValue(tableInfo))
         fmtString = "{0,-" + width.ToString() + "}"
         Console.Write(fmtString, value)
      Next      
      Console.WriteLine()
   End Sub
End Module

필요한 리소스 파일 및 어셈블리를 빌드하고 다음 배치 파일을 실행하여 앱을 실행할 수 있습니다. /r 옵션을 사용하여 UIElements.dll에 대한 참조와 함께 Resgen.exe를 제공해야 합니다. 이렇게 해야 PersonTable 구조에 대한 정보에 액세스할 수 있습니다. C#을 사용하는 경우 vbc 컴파일러 이름을 csc로 바꾸고, .vb 확장을 .cs로 바꿉니다.

vbc /t:library UIElements.vb
vbc CreateResources.vb /r:UIElements.dll
CreateResources

resgen UIResources.resx  /r:UIElements.dll
vbc GetObject.vb /r:UIElements.dll /resource:UIResources.resources

GetObject.exe

GetObject(String, CultureInfo) 메서드

반환된 리소스는 지정된 culture문화권 또는 속성에 지정된 문화권(있는 경우 culturenull)에 대해 CultureInfo.CurrentUICulture 지역화됩니다. 리소스가 해당 문화권에 대해 지역화되지 않은 경우 리소스 관리자는 대체 규칙을 사용하여 적절한 리소스를 로드합니다. 사용할 수 있는 지역화된 리소스 집합이 없으면 리소스 관리자는 기본 문화권의 리소스를 다시 사용합니다. 기본 문화권에 대한 리소스 집합을 찾을 수 없는 경우 메서드는 예외를 MissingManifestResourceException throw하거나, 리소스 집합이 위성 어셈블리에 상주해야 하는 경우 예외를 MissingSatelliteAssemblyException throw합니다. 리소스 관리자가 적절한 리소스 집합을 로드할 수 있지만 이름이 지정된 name리소스를 찾을 수 없는 경우 메서드가 반환됩니다 null.

예시

다음 예제에서는 GetObject(String, CultureInfo) 메서드를 사용하여 사용자 지정 개체를 역직렬화합니다. 이 예제에는 다음 구조체를 정의하는 NumberInfo.cs(Visual Basic을 사용하는 경우 NumberInfo.vb)라는 Numbers소스 코드 파일이 포함되어 있습니다. 이 구조는 영어가 아닌 학생들에게 영어로 10명까지 계산하도록 가르치는 간단한 교육 앱에서 사용됩니다. 클래스는 Numbers 특성으로 SerializableAttribute 표시됩니다.

using System;

[Serializable] public class Numbers2
{
   public readonly string One;
   public readonly string Two;
   public readonly string Three;
   public readonly string Four;
   public readonly string Five;
   public readonly string Six;
   public readonly string Seven;
   public readonly string Eight;
   public readonly string Nine;
   public readonly string Ten;

   public Numbers2(string one, string two, string three, string four, 
                  string five, string six, string seven, string eight,
                  string nine, string ten)
   {                     
      this.One = one;
      this.Two = two;
      this.Three = three;
      this.Four = four;
      this.Five = five;
      this.Six = six;
      this.Seven = seven;
      this.Eight = eight;
      this.Nine = nine;
      this.Ten = ten;                                    
   }                  
}
<Serializable> Public Class Numbers2
    Public ReadOnly One As String
    Public ReadOnly Two As String
    Public ReadOnly Three As String
    Public ReadOnly Four As String
    Public ReadOnly Five As String
    Public ReadOnly Six As String
    Public ReadOnly Seven As String
    Public ReadOnly Eight As String
    Public ReadOnly Nine As String
    Public ReadOnly Ten As String

    Public Sub New(one As String, two As String, three As String, four As String,
                   five As String, six As String, seven As String, eight As String,
                   nine As String, ten As String)
        Me.One = one
        Me.Two = two
        Me.Three = three
        Me.Four = four
        Me.Five = five
        Me.Six = six
        Me.Seven = seven
        Me.Eight = eight
        Me.Nine = nine
        Me.Ten = ten
    End Sub
End Class

CreateResources.cs(Visual Basic용 CreateResources.vb)라는 파일의 다음 소스 코드는 기본 영어 및 프랑스어, 포르투갈어 및 러시아어 언어에 대한 XML 리소스 파일을 만듭니다.

using System;
using System.Resources;

public class CreateResource
{
   public static void Main()
   {
      Numbers en = new Numbers("one", "two", "three", "four", "five",
                               "six", "seven", "eight", "nine", "ten");
      CreateResourceFile(en, "en");
      Numbers fr = new Numbers("un", "deux", "trois", "quatre", "cinq", 
                               "six", "sept", "huit", "neuf", "dix");
      CreateResourceFile(fr, "fr");
      Numbers pt = new Numbers("um", "dois", "três", "quatro", "cinco", 
                               "seis", "sete", "oito", "nove", "dez");
      CreateResourceFile(pt, "pt"); 
      Numbers ru = new Numbers("один", "два", "три", "четыре", "пять", 
                               "шесть", "семь", "восемь", "девять", "десять");                                                       
      CreateResourceFile(ru, "ru");
   }

   public static void CreateResourceFile(Numbers n, string lang)
   {
      string filename = @".\NumberResources" + 
                        (lang != "en" ? "." + lang : "" ) +
                        ".resx";
      ResXResourceWriter rr = new ResXResourceWriter(filename);
      rr.AddResource("Numbers", n);
      rr.Generate();
      rr.Close();    
   }
}
Imports System.Resources

Module CreateResource
   Public Sub Main()
      Dim en As New Numbers("one", "two", "three", "four", "five",
                            "six", "seven", "eight", "nine", "ten")
      CreateResourceFile(en, "en")
      Dim fr As New Numbers("un", "deux", "trois", "quatre", "cinq", 
                            "six", "sept", "huit", "neuf", "dix")
      CreateResourceFile(fr, "fr")
      Dim pt As New Numbers("um", "dois", "três", "quatro", "cinco", 
                            "seis", "sete", "oito", "nove", "dez")
      CreateResourceFile(pt, "pt") 
      Dim ru As New Numbers("один", "два", "три", "четыре", "пять", 
                            "шесть", "семь", "восемь", "девять", "десять")                                                       
      CreateResourceFile(ru, "ru")
   End Sub

   Public Sub CreateResourceFile(n As Numbers, lang As String)
      Dim filename As String = ".\NumberResources" + 
                               If(lang <> "en", "." + lang, "") +
                               ".resx"
      Dim rr As New ResXResourceWriter(filename)
      rr.AddResource("Numbers", n)
      rr.Generate()
      rr.Close()    
   End Sub
End Module

리소스는 현재 UI 문화권을 프랑스어(프랑스), 포르투갈어(브라질) 또는 러시아어(러시아)로 설정하는 다음 앱에서 사용됩니다. 이 메서드는 GetObject(String) 지역화된 숫자가 포함된 개체를 가져오는 Numbers 메서드와 GetObject(String, CultureInfo) 영어 번호가 포함된 개체를 Numbers 가져오는 메서드를 호출합니다. 그런 다음 현재 UI 문화권과 영어를 사용하여 홀수 숫자를 표시합니다. 소스 코드 파일의 이름은 ShowNumbers.cs(ShowNumbers.vb)입니다.

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

[assembly:NeutralResourcesLanguageAttribute("en-US")]

public class Example
{
   static string[] cultureNames = [ "fr-FR", "pt-BR", "ru-RU" ];

   public static void Main()
   {
      // Make any non-default culture the current culture.
      Random rnd = new Random();
      CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureNames[rnd.Next(0, cultureNames.Length)]);
      Thread.CurrentThread.CurrentUICulture = culture;
      Console.WriteLine("The current culture is {0}\n", CultureInfo.CurrentUICulture.Name);
      CultureInfo enCulture = CultureInfo.CreateSpecificCulture("en-US");

      ResourceManager rm = new ResourceManager(typeof(NumberResources));
      Numbers numbers = (Numbers) rm.GetObject("Numbers");
      Numbers numbersEn = (Numbers) rm.GetObject("Numbers", enCulture);
      Console.WriteLine("{0} --> {1}", numbers.One, numbersEn.One);
      Console.WriteLine("{0} --> {1}", numbers.Three, numbersEn.Three);
      Console.WriteLine("{0} --> {1}", numbers.Five, numbersEn.Five);
      Console.WriteLine("{0} --> {1}", numbers.Seven, numbersEn.Seven);
      Console.WriteLine("{0} --> {1}\n", numbers.Nine, numbersEn.Nine);
   }
}

internal class NumberResources
{
}
// The example displays output like the following:
//       The current culture is pt-BR
//
//       um --> one
//       três --> three
//       cinco --> five
//       sete --> seven
//       nove --> nine
Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Example2
    Dim cultureNames() As String = {"fr-FR", "pt-BR", "ru-RU"}

    Public Sub Main()
        ' Make any non-default culture the current culture.
        Dim rnd As New Random
        Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureNames(rnd.Next(0, cultureNames.Length)))
        Thread.CurrentThread.CurrentUICulture = culture
        Console.WriteLine("The current culture is {0}", CultureInfo.CurrentUICulture.Name)
        Console.WriteLine()
        Dim enCulture As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")

        Dim rm As New ResourceManager(GetType(NumberResources))
        Dim numbers As Numbers = CType(rm.GetObject("Numbers"), Numbers)
        Dim numbersEn As Numbers = CType(rm.GetObject("Numbers", enCulture), Numbers)
        Console.WriteLine("{0} --> {1}", numbers.One, numbersEn.One)
        Console.WriteLine("{0} --> {1}", numbers.Three, numbersEn.Three)
        Console.WriteLine("{0} --> {1}", numbers.Five, numbersEn.Five)
        Console.WriteLine("{0} --> {1}", numbers.Seven, numbersEn.Seven)
        Console.WriteLine("{0} --> {1}", numbers.Nine, numbersEn.Nine)
        Console.WriteLine()
    End Sub
End Module


Friend Class NumberResources
End Class

' The example displays output like the following:
'       The current culture is pt-BR
'       
'       um --> one
'       três --> three
'       cinco --> five
'       sete --> seven
'       nove --> nine

다음 일괄 처리 파일을 사용하여 Visual Basic 버전의 예제를 빌드하고 실행할 수 있습니다. C#vbc을 사용하는 경우 확장을 /로 csc바꾸고 확장을 .로 .cs바꿉 .vb 니다.

vbc /t:library NumberInfo.vb

vbc CreateResources.vb /r:NumberInfo.dll
CreateResources

resgen NumberResources.resx /r:NumberInfo.dll

resgen NumberResources.fr.resx /r:Numberinfo.dll
Md fr
al /embed:NumberResources.fr.resources /culture:fr /t:lib /out:fr\ShowNumbers.resources.dll

resgen NumberResources.pt.resx  /r:Numberinfo.dll
Md pt
al /embed:NumberResources.pt.resources /culture:pt /t:lib /out:pt\ShowNumbers.resources.dll

resgen NumberResources.ru.resx /r:Numberinfo.dll
Md ru
al /embed:NumberResources.ru.resources /culture:ru /t:lib /out:ru\ShowNumbers.resources.dll

vbc ShowNumbers.vb /r:NumberInfo.dll /resource:NumberResources.resources
ShowNumbers.exe

성능 고려 사항

동일한 name 매개 변수를 사용하여 메서드를 GetObject 여러 번 호출하는 경우 각 호출을 통해 동일한 개체에 대한 참조를 반환하는 메서드에 의존하지 마세요. 메서드가 캐시의 GetObject 기존 리소스 개체에 대한 참조를 반환하거나 리소스를 다시 로드하고 새 리소스 개체에 대한 참조를 반환할 수 있기 때문입니다.