위성 어셈블리의 리소스 검색

원칙적으로는 기본 또는 중립 어셈블리의 리소스를 주 어셈블리와 함께 패키지하고 응용 프로그램에서 지원하는 각 언어에 대해 별도의 위성 어셈블리를 만들어야 합니다. ResourceManager 클래스는 런타임에 문화권별 리소스에 대한 액세스를 가능하게 하며, 리소스 대체(fallback) 프로세스를 사용하여 응용 프로그램에서 리소스를 검색하는 방법을 제어합니다. 자세한 내용은 리소스 패키징 및 배포 항목의 "리소스 대체(fallback) 프로세스" 하위 항목을 참조하십시오. ResourceManager 클래스의 생성자 중 하나를 통해 리소스에 액세스할 수 있게 됩니다. 이렇게 하려면 리소스를 위성 어셈블리로 컴파일하거나 리소스가 응용 프로그램의 주 어셈블리 일부여야 합니다.

ResourceManager는 현재 스레드의 CultureInfo.CurrentUICulture 속성을 기반으로 검색할 리소스를 결정합니다. 예를 들어 응용 프로그램이 기본 영어 리소스 및 프랑스어와 독일어 리소스를 포함하는 두 개의 위성 어셈블리로 컴파일되고 CurrentUICulture 속성이 "de"로 설정되면 ResourceManager는 독일어 리소스를 검색합니다. CurrentUICulture 속성을 설정하는 방법에 대한 자세한 내용은 CurrentUICulture 속성 사용을 참조하십시오.

다음 예제에서는 ResourceManager.GetString 메서드를 사용하여 문자열 리소스를 검색하고 표시합니다.

…
Dim private rm As ResourceManager
rm = New ResourceManager("MyStrings", Me.GetType().Assembly)
Console.Writeline(rm.GetString("string1"))
…
…
private ResourceManager rm;
rm = new ResourceManager("MyStrings", this.GetType().Assembly);
Console.Writeline(rm.GetString("string1"));
…

이 코드는 MyStrings 파일에서 string1을 검색하여 표시합니다. 실제로 로드되는 문자열은 현재 스레드의 CurrentUICulture 속성에 따라 결정됩니다.

다음 예제에서는 ResourceManager.GetObject 메서드를 사용하여 그래픽 이미지 같은 이진 리소스를 검색하고 표시합니다.

…
Dim private rm As ResourceManager
rm = New ResourceManager("MyImages", Me.GetType().Assembly)
PictureBox.Image = Ctype(rm.GetObject("MyObject"), System.Drawing.Image)
…
…
private ResourceManager rm;
rm = new ResourceManager("MyImages", this.GetType().Assembly);
PictureBox.Image = (System.Drawing.Image)rm.GetObject("MyObject");
…

이 코드는 MyImages 리소스 파일에서 MyObject라는 개체를 로드하고 MyObject 를 Image 형식으로 캐스팅한 다음 PictureBox 이미지 속성에 할당합니다. 실제로 로드되는 개체는 현재 스레드의 CurrentUICulture 속성에 따라 결정됩니다.

ResourceSet 클래스는 단일 문화권에 대해 지역화된 모든 리소스를 저장합니다. ResourceSet 클래스는 리소스 대체(fallback) 프로세스를 사용하지 않으므로 지역화된 응용 프로그램에서는 유용하지 않습니다.

위성 어셈블리의 버전 관리 지원

기본적으로 ResourceManager는 요청된 리소스를 검색할 때 주 어셈블리의 버전 번호와 일치하는 버전 번호를 가진 위성 어셈블리를 찾습니다. 응용 프로그램을 배포한 후 주 어셈블리 또는 특정 리소스 위성 어셈블리를 업데이트할 수 있습니다. .NET Framework에서는 주 어셈블리와 위성 어셈블리에 대한 버전 관리 지원을 제공합니다.

SatelliteContractVersionAttribute 클래스에서는 주 어셈블리에 대한 버전 관리 지원을 제공합니다. 응용 프로그램의 주 어셈블리에서 SatelliteContractVersionAttribute를 지정하면 위성 어셈블리를 업데이트하지 않고도 주 어셈블리를 업데이트하고 다시 배포할 수 있습니다. 주 어셈블리를 업데이트한 후에는 주 어셈블리의 버전 번호를 증가시키지만 위성 계약 버전 번호는 그대로 둡니다. ResourceManager는 요청된 리소스를 검색할 때 이 특성으로 지정한 위성 어셈블리 버전을 로드합니다.

게시자 정책 어셈블리에서는 위성 어셈블리에 대한 버전 관리 지원을 제공합니다. 또한 주 어셈블리를 업데이트하지 않고도 위성 어셈블리를 업데이트하고 다시 배포할 수 있습니다. 위성 어셈블리를 업데이트한 후에는 위성 어셈블리의 버전 번호를 증가시키고 게시자 정책 어셈블리와 함께 제공합니다. 게시자 정책 어셈블리에서, 새 위성 어셈블리가 이전 버전과 호환 가능하도록 지정합니다. ResourceManager는 주 어셈블리의 기존 위성 계약 버전 번호를 사용하여 요청된 리소스를 검색하지만 어셈블리 로더가 게시자 정책 어셈블리에 지정된 위성 어셈블리 버전에 바인딩하므로 업데이트 버전의 올바른 어셈블리가 검색됩니다. 게시자 정책 어셈블리에 대한 자세한 내용은 게시자 정책 파일 만들기를 참조하십시오.

완전한 어셈블리 버전 관리 지원을 가능하게 하려면 강력한 이름의 어셈블리는 전역 어셈블리 캐시에 배포하고 강력한 이름이 없는 어셈블리는 응용 프로그램 디렉터리에 배포하는 것이 좋습니다. 응용 프로그램 디렉터리에 강력한 이름의 어셈블리를 배포하려는 경우에는 어셈블리를 업데이트할 때 위성 어셈블리의 버전 번호를 증가시킬 수 없습니다. 대신 기존 코드를 업데이트된 코드로 대체하고 같은 버전 번호를 유지하는 내부 업데이트를 수행해야 합니다. 예를 들어, 위성 어셈블리 버전 1.0.0.0을 완전히 지정된 어셈블리 이름 "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a"로 업데이트하려면, 완전히 지정된 같은 어셈블리 이름 "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a"로 컴파일된 업데이트된 myApp.resources.dll로 이 어셈블리를 덮어써야 합니다. 위성 어셈블리 파일에 대한 내부 업데이트를 사용하면 버전 번호가 증가되지 않으므로 응용 프로그램에서 위성 어셈블리의 버전을 정확히 확인하기가 어렵습니다.

어셈블리 버전 관리에 대한 자세한 내용은 어셈블리 버전 관리런타임에서 어셈블리를 찾는 방법을 참조하십시오.

참고 항목

참조

ResourceManager

개념

응용 프로그램의 리소스

리소스 패키징 및 배포

런타임에서 어셈블리를 찾는 방법

.Resources 파일의 리소스 검색