위성 어셈블리 만들기
업데이트: 2007년 11월
리소스 패키징 및 배포 항목에서 설명한 허브와 스포크 모델은 리소스를 사용하는 응용 프로그램 개발을 위해 권장되는 디자인 구현입니다.
허브와 스포크 모델을 사용하려면 리소스를 쉽게 찾아서 사용할 수 있도록 특정 위치에 두어야 합니다. 리소스 컴파일과 이름 지정을 제대로 하지 않거나 리소스를 정확한 위치에 두지 않으면 공용 언어 런타임에서는 이 리소스를 찾을 수 없으며 그 결과 기본 리소스 집합을 사용합니다. 리소스 이름에 대한 자세한 내용은 CultureInfo 클래스 또는 리소스 패키징 및 배포를 참조하십시오.
위성 어셈블리 컴파일
어셈블리 링커(Al.exe)를 사용하여 .resources 파일을 위성 어셈블리로 컴파일할 수 있습니다. Al.exe는 사용자가 지정한 .resources 파일로부터 어셈블리를 만듭니다. 정의에 따라, 위성 어셈블리는 리소스만 포함할 수 있으며 실행 코드는 포함할 수 없습니다.
다음 Al.exe 명령은 strings.de.resources 파일로부터 MyApp 응용 프로그램에 대한 위성 어셈블리를 만듭니다.
al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll
다음 Al.exe 명령은 strings.de.resources 파일로부터 MyApp 응용 프로그램에 대한 위성 어셈블리도 만듭니다. /template 옵션을 사용하면 위성 어셈블리가 부모 어셈블리인 MyApp.dll로부터 어셈블리 메타데이터를 상속합니다.
al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll
/template:MyApp.dll
다음 표에서는 이러한 예제에 사용된 Al.exe 옵션을 더 자세히 설명합니다.
옵션 |
설명 |
---|---|
/t:lib |
/t 옵션은 위성 어셈블리가 라이브러리 파일(.dll)로 컴파일되도록 지정합니다. 위성 어셈블리는 코드를 포함하지 않고 응용 프로그램의 주 어셈블리가 아니므로 이 어셈블리를 실행할 수 없습니다. 그러므로 위성 어셈블리를 DLL로 저장해야 합니다. |
/embed:strings.de.resources |
/embed 옵션은 Al.exe로 어셈블리를 컴파일하는 경우 사용할 소스 파일의 이름을 지정합니다. 위성 어셈블리에 여러 개의 .resources 파일을 포함할 수 있지만 허브와 스포크 모델을 사용하는 경우에는 각 culture에 대해 하나의 위성 어셈블리를 컴파일해야 합니다. 그러나 문자열 및 개체에 대해 별도의 .resources 파일을 만들 수 있습니다. |
/culture:de |
/culture 옵션은 컴파일할 리소스의 culture를 지정합니다. 런타임에서는 지정된 culture의 리소스를 검색하는 경우 이 정보를 사용합니다. 이 옵션을 생략해도 Al.exe는 리소스를 컴파일하지만 런타임에서는 사용자가 리소스를 요청할 때 해당 리소스를 찾을 수 없습니다. |
/out:MyApp.resources.dll |
/out 옵션은 출력 파일의 이름을 지정합니다. 이 이름은 명명 표준 baseName.resources.extension을 따라야 합니다. 여기서 baseName은 주 어셈블리의 이름이고 extension은 .dll 같은 실행 가능한 확장명입니다. 런타임에서는 출력 파일 이름을 기반으로 위성 어셈블리의 culture를 결정할 수 없습니다. 그러므로 위에서 설명한 /culture 옵션을 사용하여 culture를 지정해야 합니다. |
/template:filename |
/template 옵션은 culture 필드를 제외하고 모든 어셈블리 메타데이터를 상속할 어셈블리를 지정합니다. 위성 어셈블리를 상속하는 어셈블리는 강력한 이름을 가져야 합니다. |
Al.exe에서 사용할 수 있는 전체 옵션 목록을 보려면 어셈블리 링커(Al.exe)를 참조하십시오.
강력한 이름을 사용하여 위성 어셈블리 컴파일
위성 어셈블리를 전역 어셈블리 캐시에 설치하려면 어셈블리 이름이 강력한 이름이어야 합니다. 강력한 이름의 어셈블리는 올바른 공개/개인 키 쌍으로 서명됩니다. 강력한 이름에 대한 자세한 내용은 강력한 이름의 어셈블리를 참조하십시오.
응용 프로그램을 개발하는 경우 최종 공개/개인 키 쌍에 대한 액세스 권한을 갖게 되지는 않습니다. 위성 어셈블리를 전역 어셈블리 캐시에 설치하고 제대로 동작하게 하려면 서명 연기라는 기법을 사용하면 됩니다. 어셈블리 서명을 연기하면 빌드할 때 강력한 이름 시그니처에 사용할 파일 공간이 예약됩니다. 나중에 최종 공개/개인 키 쌍을 사용할 수 있을 때까지 실제 서명이 연기됩니다.
공개 키 얻기
어셈블리 서명을 연기하려면 공개 키에 액세스할 수 있어야 합니다. 최종 서명을 수행하는 회사 내 조직으로부터 실제 공개 키를 얻거나 강력한 이름 도구(Sn.exe)를 사용하여 공개 키를 만들 수 있습니다.
다음 Sn.exe 명령은 테스트 공개/개인 키 쌍을 만들어 TestKeyPair.snk 파일에 저장합니다. –k 옵션은 새 키 쌍을 만들어 지정된 파일에 저장하도록 Sn.exe에 지정합니다.
sn –k TestKeyPair.snk
테스트 키 쌍을 포함하는 파일에서 공개 키를 추출할 수 있습니다. 다음 명령은 TestKeyPair.snk에서 공개 키를 추출하여 PublicKey.snk에 저장합니다.
sn –p TestKeyPair.snk PublicKey.snk
어셈블리 서명 연기
공개 키를 얻었거나 만든 후에는 어셈블리 링커(Al.exe)를 사용하여 어셈블리를 컴파일하고 서명 연기를 지정할 수 있습니다.
다음 Al.exe 명령은 strings.ja.resources 파일로부터 MyApp 응용 프로그램에 대한 강력한 이름의 위성 어셈블리를 만듭니다.
al /t:lib /embed:strings.ja.resources /culture:ja /out:MyApp.resources.dll /delay+ /keyfile:PublicKey.snk
/delay+ 옵션은 어셈블리 서명을 연기하도록 지정합니다. /keyfile: 옵션은 어셈블리 서명을 연기하기 위해 사용할 공개 키를 포함하는 키 파일의 이름을 지정합니다.
서명 연기에 대한 자세한 내용은 어셈블리 서명 연기를 참조하십시오.
강력한 이름의 어셈블리에는 바인딩 요청을 만족시키는 데 사용할 어셈블리를 결정하기 위해 런타임에서 사용하는 버전 정보가 포함됩니다. 이 항목에 대한 자세한 내용은 어셈블리 버전 관리를 참조하십시오.
어셈블리 다시 서명
서명 연기된 위성 어셈블리는 실제 키 쌍을 사용하여 나중에 다시 서명해야 합니다. Sn.exe를 사용하여 이를 수행할 수 있습니다.
다음 Sn.exe 명령은 RealKeyPair.snk 파일에 저장된 실제 키 쌍으로 MyApp.resources.dll에 서명합니다. –R 옵션은 이전에 서명했거나 서명이 연기된 어셈블리에 다시 서명하도록 Sn.exe에 지정합니다.
sn –R MyApp.resources.dll RealKeyPair.snk
전역 어셈블리 캐시에 위성 어셈블리 설치
리소스 대체(fallback) 프로세스에서 런타임은 가장 먼저 전역 어셈블리 캐시에서 리소스를 검색합니다. 자세한 내용은 리소스 패키징 및 배포 항목의 "리소스 대체(fallback) 프로세스" 하위 항목을 참조하십시오. 따라서 전역 어셈블리 캐시에 리소스를 설치하는 방법을 알아야 합니다. 강력한 이름으로 컴파일한 위성 어셈블리는 전역 어셈블리 캐시에 설치할 수 있습니다. 전역 어셈블리 캐시 도구(Gacutil.exe)를 사용하여 캐시에 어셈블리를 설치할 수 있습니다.
다음 Gacutil.exe 명령은 MyApp.resources.dll을 전역 어셈블리 캐시에 설치합니다.
gacutil /i:MyApp.resources.dll
/i 옵션은 지정된 어셈블리를 전역 어셈블리 캐시에 설치하도록 Gacutil.exe에 지정합니다. 이 명령을 실행하면 엔트리가 캐시에 포함되어 이 .resources 파일의 엔트리에 액세스할 수 있습니다. 캐시에 설치된 후에는 지정된 리소스를 사용하도록 되어 있는 모든 응용 프로그램에서 리소스를 사용할 수 있습니다.
전역 어셈블리 캐시에 설치되지 않은 위성 어셈블리의 디렉터리 위치
위성 어셈블리를 컴파일하면 위성 어셈블리는 모두 같은 이름을 가집니다. 런타임에서는 컴파일 타임에 Al.exe의 /culture 옵션을 사용하여 지정한 culture 및 각 어셈블리의 디렉터리 위치에 따라 각 위성 어셈블리를 구별합니다. 그러므로 예상 디렉터리 위치에 위성 어셈블리를 두어야 합니다.
다음 그림에서는 전역 어셈블리 캐시에 설치하지 않는 응용 프로그램에 대한 위치 요구 사항 및 샘플 디렉터리 구조를 보여 줍니다. .txt 및 .resources 파일 확장명을 가진 항목은 최종 응용 프로그램과 함께 제공되지 않습니다. 이러한 항목은 최종 위성 리소스 어셈블리를 만드는 데 사용되는 중간 리소스 파일입니다. 이 예제에서는 .resx 파일로 .txt 파일을 대체할 수 있습니다. .resx 파일은 개체를 포함할 수 있는 중간 리소스 파일 형식으로 유일하게 사용됩니다.
위성 어셈블리 디렉터리
참고: |
---|
응용 프로그램에 하위 culture의 리소스가 들어 있는 경우 각 하위 culture를 고유 디렉터리에 두십시오. 주 culture 디렉터리의 하위 디렉터리에 하위 culture를 두면 안 됩니다. |