Share via


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:

A satellite assembly directory with localized cultures subdirectories.

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 lebih lanjut, lihat Mempermudah untuk memilih pembuatan rakitan 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:

  1. 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.

  2. 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")>
    
  3. Tambahkan dukungan untuk budaya tambahan (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 Greeting.en-US.resx atau Greeting.en-US.txt, dan simpan di dalamnya string tunggal bernama HelloString 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 bernama HelloString 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 bernama HelloString yang nilainya "Всем привет!".

  4. 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.

  5. 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
    
  6. 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.

  7. 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:

  1. 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.

  2. Gunakan perintah Strong Name Tool (Sn.exe) berikut untuk membuat file kunci publik bernama PublicKey.snk:

    sn –p ResKey.snk PublicKey.snk
    
  3. 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.

  4. 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")>
    
  5. 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 "Привет!".

  6. 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.

  7. 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, bukan Visual Studio untuk membuat contoh, Anda harus mengubah panggilan ke konstruktor kelas ResourceManager 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
    
  8. 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.

  9. 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.

  10. Tanda tangani ulang StringLibrary.dll dengan menggunakan alat Strong Name (sn.exe) sebagai berikut:

    sn –R StringLibrary.dll RealKeyPair.snk
    
  11. 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
    
  12. 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.

  13. 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
    
  14. Jalankan Example.exe.

Lihat juga