Membuat rakitan satelit untuk aplikasi .NET
File sumber daya memainkan peran terpusat dalam aplikasi yang dilokalkan. Mereka memungkinkan aplikasi menampilkan string, gambar, dan data lain dalam bahasa serta budaya pengguna, dan menyediakan data alternatif jika sumber daya untuk bahasa atau budaya pengguna tidak tersedia. .NET menggunakan model hub-and-spoke untuk menemukan dan mengambil sumber daya yang dilokalkan. Hub adalah rakitan utama yang berisi kode yang dapat dijalankan yang tidak dapat dilokalkan dan sumber daya untuk satu budaya, yang disebut budaya netral atau default. Budaya default adalah budaya fallback untuk aplikasi; ini digunakan ketika tidak ada sumber daya yang dilokalkan yang tersedia. Anda menggunakan atribut NeutralResourcesLanguageAttribute untuk menetapkan budaya dari budaya default aplikasi. Setiap spoke terhubung ke rakitan satelit yang berisi sumber daya untuk satu budaya yang dilokalkan, tetapi tidak berisi kode apa pun. Karena rakitan satelit bukan bagian dari rakitan utama, Anda dapat dengan mudah memperbarui atau mengganti sumber daya yang sesuai dengan budaya tertentu tanpa mengganti rakitan utama untuk aplikasi.
Catatan
Sumber daya budaya default aplikasi juga dapat disimpan dalam rakitan satelit. Untuk melakukan ini, Anda menetapkan atribut NeutralResourcesLanguageAttribute dari nilai UltimateResourceFallbackLocation.Satellite.
Nama dan lokasi rakitan satelit
Model hub-and-spoke mengharuskan Anda menempatkan sumber daya di lokasi tertentu sehingga dapat dengan mudah ditemukan dan digunakan. Jika Anda tidak mengompilasi dan memberi nama sumber daya seperti yang diharapkan, atau jika Anda tidak menempatkannya di lokasi yang benar, runtime bahasa umum tidak akan dapat menemukannya dan akan menggunakan sumber daya budaya default sebagai gantinya. Manajer sumber daya .NET diwakili oleh jenis ResourceManager, dan digunakan untuk mengakses sumber daya yang dilokalkan secara otomatis. Manajer sumber daya memerlukan hal berikut:
Satu rakitan satelit harus mencakup semua sumber daya untuk budaya tertentu. Dengan kata lain, Anda harus mengompilasi beberapa file .txt atau .resx menjadi satu file biner .resources.
Harus ada subdirektori terpisah dalam direktori aplikasi untuk setiap budaya lokal yang menyimpan sumber daya budaya tersebut. Nama subdirektori harus sama dengan nama budaya. Sebagai alternatif, Anda dapat menyimpan rakitan satelit Anda di cache rakitan global. Dalam hal ini, komponen informasi budaya dari nama kuat rakitan harus menunjukkan budayanya. Untuk informasi lebih lanjut, lihat Menginstal rakitan satelit di Cache Rakitan Global.
Catatan
Jika aplikasi Anda menyertakan sumber daya untuk subkultur, tempatkan setiap subkultur dalam subdirektori terpisah di bawah direktori aplikasi. Jangan tempatkan subkultur dalam subdirektori di bawah direktori budaya utama mereka.
Rakitan satelit harus memiliki nama yang sama dengan aplikasi, dan harus menggunakan ekstensi nama file ".resources.dll". Misalnya, jika aplikasi bernama Example.exe, nama setiap rakitan satelit harus Example.resources.dll. Nama rakitan satelit tidak menunjukkan budaya file sumber dayanya. Namun, rakitan satelit muncul di direktori yang memang menentukan budaya.
Informasi tentang budaya rakitan satelit harus dimasukkan dalam metadata rakitan. Untuk menyimpan nama budaya dalam metadata rakitan satelit, tentukan opsi
/culture
saat Anda menggunakan Assembly Linker untuk menyematkan sumber daya di rakitan satelit.
Ilustrasi berikut menunjukkan contoh struktur direktori dan persyaratan lokasi untuk aplikasi yang tidak Anda instal di cache rakitan global. Item dengan ekstensi .txt dan .resources tidak akan dikirimkan bersama aplikasi akhir. Ini adalah file sumber daya perantara yang digunakan untuk membuat rakitan sumber daya satelit akhir. Dalam contoh ini, Anda dapat mengganti file .resx dengan file .txt. Untuk informasi lebih lanjut, lihat Mengemas dan menyebarkan sumber daya.
Gambar berikut menunjukkan direktori rakitan satelit:
Mengompilasi rakitan satelit
Anda menggunakan Resource File Generator (resgen.exe) untuk mengompilasi file teks atau file XML (.resx) yang berisi sumber daya ke file .resources biner. Anda kemudian menggunakan Assembly Linker (al.exe) untuk mengompilasi file .resources ke dalam rakitan satelit. al.exe membuat rakitan dari file .resources yang Anda tentukan. Rakitan satelit hanya dapat berisi sumber daya; mereka tidak dapat berisi kode yang dapat dijalankan.
Perintah al.exe berikut membuat rakitan satelit untuk aplikasi Example
dari file sumber daya bahasa Jerman strings.de.resources.
al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll
Perintah al.exe berikut juga membuat rakitan satelit untuk aplikasi Example
dari file strings.de.resources. Opsi /template menyebabkan rakitan satelit mewarisi semua metadata rakitan, kecuali untuk informasi budayanya dari rakitan induk (Example.dll).
al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll -template:Example.dll
Tabel berikut menjelaskan opsi al.exe yang digunakan dalam perintah ini secara lebih terperinci:
Opsi | Deskripsi |
---|---|
-target:lib |
Menentukan bahwa rakitan satelit Anda dikompilasi ke file pustaka (.dll). Karena rakitan satelit tidak berisi kode yang dapat dieksekusi dan bukan rakitan utama aplikasi, Anda harus menyimpan rakitan satelit sebagai DLL. |
-embed:strings.de.resources |
Menentukan nama file sumber daya yang akan disematkan saat al.exe mengompilasi rakitan. Anda dapat menyematkan beberapa file .resources dalam rakitan satelit, tetapi jika Anda mengikuti model hub-and-spoke, Anda harus mengompilasi satu rakitan satelit untuk setiap budaya. Namun, Anda dapat membuat file .resources terpisah untuk string dan objek. |
-culture:de |
Menentukan budaya sumber daya yang akan dikompilasi. Runtime bahasa umum menggunakan informasi ini saat mencari sumber daya untuk budaya tertentu. Jika Anda menghilangkan opsi ini, al.exe masih akan mengompilasi sumber daya, tetapi runtime tidak akan dapat menemukannya saat pengguna memintanya. |
-out:Example.resources.dll |
Menentukan nama file output. Nama harus mengikuti standar penamaan baseName.resources.extension, dengan baseName adalah nama rakitan utama dan extension adalah nama ekstensi nama file yang valid (seperti .dll). Runtime tidak dapat menentukan budaya rakitan satelit berdasarkan nama file output-nya; Anda harus menggunakan opsi /culture untuk menentukannya. |
-template:Example.dll |
Menentukan rakitan tempat rakitan satelit akan mewarisi semua metadata rakitan, kecuali bidang budaya. Opsi ini memengaruhi rakitan satelit hanya jika Anda menentukan rakitan yang memiliki nama kuat. |
Untuk daftar lengkap opsi yang tersedia dengan al.exe, lihat Assembly Linker (al.exe).
Catatan
Mungkin ada kalanya Anda ingin menggunakan tugas .NET Core MSBuild untuk mengompilasi rakitan satelit, meskipun Anda menargetkan .NET Framework. Misalnya, Anda mungkin ingin menggunakan opsi deterministik pengompilasi C# untuk dapat membandingkan rakitan dari build yang berbeda. Dalam hal ini, atur GenerateSatelliteAssembliesForCore ke true
dalam file .csproj untuk menghasilkan rakitan satelit menggunakan csc.exe, bukan Al.exe (Assembly Linker).
<Project>
<PropertyGroup>
<GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
</PropertyGroup>
</Project>
Tugas .NET Core MSBuild menggunakan csc.exe, bukan al.exe untuk menghasilkan rakitan satelit, secara default. Untuk informasi selengkapnya, lihat Mempermudah untuk ikut serta dalam pembuatan perakitan satelit "Core".
Contoh rakitan satelit
Berikut ini adalah contoh "Halo dunia" sederhana yang menampilkan kotak pesan yang berisi salam yang dilokalkan. Contohnya termasuk sumber daya untuk budaya Inggris (Amerika Serikat), Prancis (Prancis), dan Rusia (Rusia), serta budaya fallback-nya adalah bahasa Inggris. Untuk membuat contoh, lakukan hal berikut:
Buat file sumber daya bernama Greeting.resx atau Greeting.txt untuk memuat sumber daya budaya default. Simpan satu string bernama
HelloString
yang nilainya "Halo dunia!" dalam berkas ini.Untuk menunjukkan bahwa bahasa Inggris (en) adalah budaya default aplikasi, tambahkan atribut System.Resources.NeutralResourcesLanguageAttribute berikut ke file AssemblyInfo aplikasi atau ke file kode sumber utama yang akan dikompilasi ke dalam perakitan utama aplikasi.
[assembly: NeutralResourcesLanguage("en")]
<Assembly: NeutralResourcesLanguage("en")>
Tambahkan dukungan untuk budaya tambahan (
en-US
,fr-FR
, danru-RU
) ke aplikasi sebagai berikut:Untuk mendukung budaya
en-US
atau bahasa Inggris (Amerika Serikat), buat file sumber daya bernama Greeting.en-US.resx atau Greeting.en-US.txt, dan simpan di dalamnya string tunggal bernamaHelloString
yang nilainya "Hi world!".Untuk mendukung budaya
fr-FR
atau bahasa Prancis (Prancis), buat file sumber daya bernama Greeting.fr-FR.resx atau Greeting.fr-FR.txt, dan simpan di dalamnya string tunggal bernamaHelloString
yang nilainya "Salut tout le monde!".Untuk mendukung budaya
ru-RU
atau bahasa Rusia (Rusia), buat file sumber daya bernama Greeting.ru-RU.resx atau Greeting.ru-RU.txt, dan simpan di dalamnya string tunggal bernamaHelloString
yang nilainya "Всем привет!".
Gunakan resgen.exe untuk mengompilasi setiap teks atau file sumber daya XML ke file .resources biner. Outputnya adalah sekumpulan file yang memiliki nama file akar yang sama dengan file .resx atau .txt, tetapi ekstensi .resources. Jika Anda membuat contoh dengan Visual Studio, proses kompilasi ditangani secara otomatis. Jika Anda tidak menggunakan Visual Studio, jalankan perintah berikut untuk mengompilasi file .resx ke dalam file .resources:
resgen Greeting.resx resgen Greeting.en-us.resx resgen Greeting.fr-FR.resx resgen Greeting.ru-RU.resx
Jika sumber daya Anda berada dalam file teks, bukan file XML, ganti ekstensi .resx dengan .txt.
Kompilasi kode sumber berikut bersama dengan sumber daya untuk budaya default ke dalam rakitan utama aplikasi:
Penting
Jika Anda menggunakan baris perintah daripada Visual Studio untuk membuat contoh, Anda harus mengubah panggilan ke konstruktor kelas ResourceManager menjadi berikut:
ResourceManager rm = new ResourceManager("Greeting", typeof(Example).Assembly);
using System; using System.Globalization; using System.Reflection; using System.Resources; using System.Threading; using System.Windows.Forms; class Example { static void Main() { // Create array of supported cultures string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"}; Random rnd = new Random(); int cultureNdx = rnd.Next(0, cultures.Length); CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture; try { CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]); Thread.CurrentThread.CurrentCulture = newCulture; Thread.CurrentThread.CurrentUICulture = newCulture; ResourceManager rm = new ResourceManager("Example.Greeting", typeof(Example).Assembly); string greeting = String.Format("The current culture is {0}.\n{1}", Thread.CurrentThread.CurrentUICulture.Name, rm.GetString("HelloString")); MessageBox.Show(greeting); } catch (CultureNotFoundException e) { Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName); } finally { Thread.CurrentThread.CurrentCulture = originalCulture; Thread.CurrentThread.CurrentUICulture = originalCulture; } } }
Imports System.Globalization Imports System.Resources Imports System.Threading Module Module1 Sub Main() ' Create array of supported cultures Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU"} Dim rnd As New Random() Dim cultureNdx As Integer = rnd.Next(0, cultures.Length) Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture Try Dim newCulture As New CultureInfo(cultures(cultureNdx)) Thread.CurrentThread.CurrentCulture = newCulture Thread.CurrentThread.CurrentUICulture = newCulture Dim greeting As String = String.Format("The current culture is {0}.{1}{2}", Thread.CurrentThread.CurrentUICulture.Name, vbCrLf, My.Resources.Greetings.HelloString) MsgBox(greeting) Catch e As CultureNotFoundException Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName) Finally Thread.CurrentThread.CurrentCulture = originalCulture Thread.CurrentThread.CurrentUICulture = originalCulture End Try End Sub End Module
Jika aplikasi bernama Contoh dan Anda mengompilasi dari baris perintah, perintah untuk pengompilasi C# adalah:
csc Example.cs -res:Greeting.resources
Perintah pengompilasi Visual Basic yang sesuai adalah:
vbc Example.vb -res:Greeting.resources
Buat subdirektori di direktori aplikasi utama untuk setiap budaya lokal yang didukung oleh aplikasi. Anda harus membuat subdirektori en-US, fr-FR, dan ru-RU. Visual Studio membuat subdirektori ini secara otomatis sebagai bagian dari proses kompilasi.
Sematkan file .resources khusus budaya individual ke rakitan satelit dan simpan ke direktori yang sesuai. Perintah untuk melakukan ini untuk setiap file .resources adalah:
al -target:lib -embed:Greeting.culture.resources -culture:culture -out:culture\Example.resources.dll
di mana budaya adalah nama budaya yang sumber dayanya terdapat dalam rakitan satelit. Visual Studio menangani proses ini secara otomatis.
Anda kemudian dapat menjalankan contoh. Ini akan secara acak membuat salah satu budaya yang didukung menjadi budaya saat ini dan menampilkan salam lokal.
Instal rakitan satelit di Singgahan Perakitan Global
Alih-alih menginstal rakitan di subdirektori aplikasi lokal, Anda dapat menginstalnya di singgahan perakitan global. Ini sangat berguna jika Anda memiliki pustaka kelas dan rakitan sumber daya pustaka kelas yang digunakan oleh beberapa aplikasi.
Menginstal rakitan di singgahan perakitan global mengharuskan mereka memiliki nama yang kuat. Rakitan bernama kuat ditandatangani dengan pasangan kunci publik/privat yang valid. Mereka berisi informasi versi yang digunakan runtime untuk menentukan rakitan mana yang akan digunakan untuk memenuhi permintaan pengikatan. Untuk informasi lebih lanjut tentang nama kuat dan pembuatan versi, lihat Pembuatan versi. Untuk informasi lebih lanjut tentang nama yang kuat, lihat Rakitan bernama kuat.
Saat Anda mengembangkan aplikasi, tidak mungkin Anda akan memiliki akses ke pasangan kunci publik/privat akhir. Untuk menginstal rakitan satelit di singgahan perakitan global dan memastikannya berfungsi seperti yang diharapkan, Anda dapat menggunakan teknik yang disebut penandatanganan tertunda. Saat Anda menunda menandatangani rakitan, pada waktu build Anda memesan ruang di file untuk tanda tangan nama yang kuat. Penandatanganan aktual tertunda hingga nanti, ketika pasangan kunci publik/privat akhir tersedia. Untuk informasi lebih lanjut tentang penundaan penandatanganan, lihat Menunda penandatanganan rakitan.
Mendapatkan kunci publik
Untuk menunda menandatangani rakitan, Anda harus memiliki akses ke kunci publik. Anda dapat memperoleh kunci publik sebenarnya dari organisasi di perusahaan Anda yang akan melakukan penandatanganan akhir, atau membuat kunci publik dengan menggunakan alat Nama Kuat (sn.exe).
Perintah Sn.exe berikut membuat pasangan kunci publik/pribadi uji. Opsi –k menetapkan bahwa Sn.exe harus membuat pasangan kunci baru dan menyimpannya dalam file bernama TestKeyPair.snk.
sn –k TestKeyPair.snk
Anda dapat mengekstrak kunci publik dari file yang berisi pasangan kunci uji. Perintah berikut mengekstrak kunci publik dari TestKeyPair.snk dan menyimpannya di PublicKey.snk:
sn –p TestKeyPair.snk PublicKey.snk
Menunda penandatanganan Rakitan
Setelah Anda memperoleh atau membuat kunci publik, Anda menggunakan Assembly Linker (al.exe) untuk mengompilasi rakitan dan menentukan penandatanganan tertunda.
Perintah al.exe berikut membuat rakitan satelit bernama kuat untuk aplikasi StringLibrary dari file strings.ja.resources:
al -target:lib -embed:strings.ja.resources -culture:ja -out:StringLibrary.resources.dll -delay+ -keyfile:PublicKey.snk
Opsi -delay+ menetapkan bahwa Assembly Linker harus menunda menandatangani rakitan. Opsi -keyfile menentukan nama file kunci yang berisi kunci publik yang akan digunakan untuk menunda penandatanganan rakitan.
Menandatangani Ulang Rakitan
Sebelum menyebarkan aplikasi, Anda harus menandatangani ulang rakitan satelit yang ditunda ditandatangani dengan pasangan kunci asli. Anda dapat melakukannya dengan menggunakan Sn.exe.
Perintah Sn.exe berikut menandatangani StringLibrary.resources.dll dengan pasangan kunci yang disimpan dalam file RealKeyPair.snk. Opsi –R menetapkan bahwa rakitan yang ditandatangani sebelumnya atau yang ditunda ditandatangani harus ditandatangani ulang.
sn –R StringLibrary.resources.dll RealKeyPair.snk
Instal rakitan satelit di Singgahan Perakitan Global
Saat runtime mencari sumber daya dalam proses penggantian sumber daya, runtime akan mencari di singgahan perakitan global terlebih dahulu. (Untuk informasi lebih lanjut, lihat bagian "Proses Penggantian Sumber Daya" dari Mengemas dan menyebarkan sumber daya.) Segera setelah rakitan satelit ditandatangani dengan nama yang kuat, rakitan dapat dipasang di singgahan perakitan global dengan menggunakan alat Singgahan Perakitan Global (gacutil.exe).
Perintah Gacutil.exe berikut akan memasang StringLibrary.resources.dll* di singgahan perakitan global:
gacutil -i:StringLibrary.resources.dll
Opsi /i menetapkan bahwa Gacutil.exe harus memasang rakitan yang ditentukan ke dalam singgahan perakitan global. Setelah rakitan satelit dipasang di cache, sumber daya yang ada di dalamnya tersedia untuk semua aplikasi yang dirancang untuk menggunakan rakitan satelit.
Sumber daya di Singgahan Perakitan Global: Contoh
Contoh berikut menggunakan metode di pustaka kelas .NET untuk mengekstrak dan mengembalikan salam yang dilokalkan dari file sumber daya. Pustaka dan sumber dayanya terdaftar di singgahan perakitan global. Contohnya mencakup sumber daya untuk budaya Inggris (Amerika Serikat), Prancis (Prancis), Rusia (Rusia), dan Inggris. Bahasa Inggris adalah budaya default; sumber dayanya disimpan di rakitan utama. Contoh awalnya menunda menandatangani pustaka dan rakitan satelitnya dengan kunci publik, lalu menandatanganinya kembali dengan pasangan kunci publik/privat. Untuk membuat contoh, lakukan hal berikut:
Jika Anda tidak menggunakan Visual Studio, gunakan perintah Strong Name Tool (Sn.exe) berikut untuk membuat pasangan kunci publik/privat bernama ResKey.snk:
sn –k ResKey.snk
Jika Anda menggunakan Visual Studio, gunakan tab Penandatanganan pada kotak dialog Properti proyek untuk membuat file kunci.
Gunakan perintah Strong Name Tool (Sn.exe) berikut untuk membuat file kunci publik bernama PublicKey.snk:
sn –p ResKey.snk PublicKey.snk
Buat file sumber daya bernama Strings.resx untuk memuat sumber daya untuk budaya default. Simpan satu string bernama
Greeting
yang nilainya "Bagaimana kabarmu?" dalam file tersebut.Untuk menunjukkan bahwa "en" adalah budaya default aplikasi, tambahkan atribut System.Resources.NeutralResourcesLanguageAttribute berikut ke file AssemblyInfo aplikasi atau ke file kode sumber utama yang akan dikompilasi ke dalam rakitan utama aplikasi:
[assembly:NeutralResourcesLanguageAttribute("en")]
<Assembly: NeutralResourcesLanguageAttribute("en")>
Tambahkan dukungan untuk budaya tambahan (budaya en-US, fr-FR, dan ru-RU) ke aplikasi sebagai berikut:
Untuk mendukung budaya "en-US" atau bahasa Inggris (Amerika Serikat), buat file sumber daya bernama Strings.en-US.resx atau Strings.en-US.txt, dan simpan di dalamnya satu string bernama
Greeting
yang nilainya "Hello!".Untuk mendukung budaya "fr-FR" atau bahasa Prancis (Prancis), buat file sumber daya bernama Strings.fr-FR.resx atau Strings.fr-FR.txt dan simpan di itu string tunggal bernama
Greeting
yang nilainya "Bon jour!".Untuk mendukung budaya "ru-RU" atau bahasa Rusia (Rusia), buat file sumber daya bernama Strings.ru-RU.resx atau Strings.ru-RU.txt dan simpan di itu string tunggal bernama
Greeting
yang nilainya "Привет!".
Gunakan resgen.exe untuk mengompilasi setiap teks atau file sumber daya XML ke file .resources biner. Outputnya adalah sekumpulan file yang memiliki nama file akar yang sama dengan file .resx atau .txt, tetapi ekstensi .resources. Jika Anda membuat contoh dengan Visual Studio, proses kompilasi ditangani secara otomatis. Jika Anda tidak menggunakan Visual Studio, jalankan perintah berikut untuk mengompilasi file .resx ke dalam file .resources:
resgen filename
Dengan namafile adalah jalur opsional, nama file, dan ekstensi .resx atau file teks.
Kompilasi kode sumber berikut untuk StringLibrary.vb atau StringLibrary.cs bersama dengan sumber daya untuk budaya default ke dalam rakitan pustaka yang ditunda ditandatangani bernama StringLibrary.dll:
Penting
Jika Anda menggunakan baris perintah daripada Visual Studio untuk membuat contoh, Anda harus memodifikasi panggilan ke ResourceManager konstruktor kelas menjadi
ResourceManager rm = new ResourceManager("Strings",
typeof(Example).Assembly);
.using System; using System.Globalization; using System.Reflection; using System.Resources; using System.Threading; [assembly:NeutralResourcesLanguageAttribute("en")] public class StringLibrary { public string GetGreeting() { ResourceManager rm = new ResourceManager("Strings", Assembly.GetAssembly(typeof(StringLibrary))); string greeting = rm.GetString("Greeting"); return greeting; } }
Imports System.Globalization Imports System.Reflection Imports System.Resources Imports System.Threading <Assembly: NeutralResourcesLanguageAttribute("en")> Public Class StringLibrary Public Function GetGreeting() As String Dim rm As New ResourceManager("Strings", _ Assembly.GetAssembly(GetType(StringLibrary))) Dim greeting As String = rm.GetString("Greeting") Return greeting End Function End Class
Perintah untuk pengompilasi C# adalah:
csc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.cs
Perintah pengompilasi Visual Basic yang sesuai adalah:
vbc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.vb
Buat subdirektori di direktori aplikasi utama untuk setiap budaya lokal yang didukung oleh aplikasi. Anda harus membuat subdirektori en-US, fr-FR, dan ru-RU. Visual Studio membuat subdirektori ini secara otomatis sebagai bagian dari proses kompilasi. Karena semua rakitan satelit memiliki nama file yang sama, subdirektori digunakan untuk menyimpan rakitan satelit khusus budaya individu hingga ditandatangani dengan pasangan kunci publik/privat.
Sematkan file .resources khusus budaya individual ke rakitan satelit yang ditunda ditandatangani dan simpan ke direktori yang sesuai. Perintah untuk melakukan ini untuk setiap file .resources adalah:
al -target:lib -embed:Strings.culture.resources -culture:culture -out:culture\StringLibrary.resources.dll -delay+ -keyfile:publickey.snk
dengan budaya adalah nama budaya. Dalam contoh ini, nama budayanya adalah en-US, fr-FR, dan ru-RU.
Tanda tangani ulang StringLibrary.dll dengan menggunakan alat Strong Name (sn.exe) sebagai berikut:
sn –R StringLibrary.dll RealKeyPair.snk
Tanda tangani ulang masing-masing rakitan satelit. Untuk melakukannya, gunakan alat Strong Name (sn.exe) sebagai berikut untuk setiap rakitan satelit:
sn –R StringLibrary.resources.dll RealKeyPair.snk
Daftarkan StringLibrary.dll dan setiap rakitan satelitnya di singgahan perakitan global dengan menggunakan perintah berikut:
gacutil -i filename
dengan filename adalah nama file yang akan didaftarkan.
Jika Anda menggunakan Visual Studio, buat proyek Console Application baru bernama
Example
, tambahkan referensi ke StringLibrary.dll dan kode sumber berikut, lalu kompilasi.using System; using System.Globalization; using System.Threading; public class Example { public static void Main() { string[] cultureNames = { "en-GB", "en-US", "fr-FR", "ru-RU" }; Random rnd = new Random(); string cultureName = cultureNames[rnd.Next(0, cultureNames.Length)]; Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName); Console.WriteLine("The current UI culture is {0}", Thread.CurrentThread.CurrentUICulture.Name); StringLibrary strLib = new StringLibrary(); string greeting = strLib.GetGreeting(); Console.WriteLine(greeting); } }
Imports System.Globalization Imports System.Threading Module Example Public Sub Main() Dim cultureNames() As String = {"en-GB", "en-US", "fr-FR", "ru-RU"} Dim rnd As New Random() Dim cultureName As String = cultureNames(rnd.Next(0, cultureNames.Length)) Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName) Console.WriteLine("The current UI culture is {0}", Thread.CurrentThread.CurrentUICulture.Name) Dim strLib As New StringLibrary() Dim greeting As String = strLib.GetGreeting() Console.WriteLine(greeting) End Sub End Module
Untuk mengompilasi dari baris perintah, gunakan perintah berikut untuk pengompilasi C#:
csc Example.cs -r:StringLibrary.dll
Baris perintah untuk pengompilasi Visual Basic adalah:
vbc Example.vb -r:StringLibrary.dll
Jalankan Example.exe.