Bagikan melalui


Kelas System.Resources.ResourceManager

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Penting

Metode panggilan dari kelas ini dengan data yang tidak tepercaya adalah risiko keamanan. Panggil metode dari kelas ini hanya dengan data tepercaya. Untuk informasi selengkapnya, lihat Memvalidasi Semua Input.

Kelas ResourceManager mengambil sumber daya dari file .resources biner yang disematkan dalam rakitan atau dari file .resources mandiri. Jika aplikasi telah dilokalkan dan sumber daya yang dilokalkan telah disebarkan di rakitan satelit, aplikasi mencari sumber daya khusus budaya, menyediakan fallback sumber daya saat sumber daya yang dilokalkan tidak ada, dan mendukung serialisasi sumber daya.

Aplikasi desktop

Untuk aplikasi desktop, ResourceManager kelas mengambil sumber daya dari file sumber daya biner (.resources). Biasanya, pengkompilasi bahasa atau Assembly Linker (AL.exe) menyematkan file sumber daya ini dalam rakitan. Anda juga dapat menggunakan ResourceManager objek untuk mengambil sumber daya langsung dari file .resources yang tidak disematkan dalam rakitan, dengan memanggil CreateFileBasedResourceManager metode .

Perhatian

Menggunakan file .resources mandiri dalam aplikasi ASP.NET akan memutus penyebaran XCOPY, karena sumber daya tetap terkunci sampai dirilis secara eksplisit oleh ReleaseAllResources metode . Jika Anda ingin menyebarkan sumber daya dengan aplikasi ASP.NET, Anda harus mengkompilasi file .resources ke dalam rakitan satelit.

Dalam aplikasi berbasis sumber daya, satu file .resources berisi sumber daya budaya default yang sumber dayanya digunakan jika tidak ada sumber daya khusus budaya yang dapat ditemukan. Misalnya, jika budaya default aplikasi adalah bahasa Inggris (en), sumber daya bahasa Inggris digunakan setiap kali sumber daya yang dilokalkan tidak dapat ditemukan untuk budaya tertentu, seperti Bahasa Inggris (Amerika Serikat) (en-US) atau Prancis (Prancis) (fr-FR). Biasanya, sumber daya untuk budaya default disematkan di perakitan aplikasi utama, dan sumber daya untuk budaya lokal lainnya disematkan dalam rakitan satelit. Rakitan satelit hanya berisi sumber daya. Mereka memiliki nama file akar yang sama dengan rakitan utama dan ekstensi .resources.dll. Untuk aplikasi yang rakitannya tidak terdaftar di cache perakitan global, rakitan satelit disimpan dalam subdirektori aplikasi yang namanya sesuai dengan budaya perakitan.

Membuat sumber daya

Saat mengembangkan aplikasi berbasis sumber daya, Anda menyimpan informasi sumber daya dalam file teks (file yang memiliki ekstensi .txt atau .restext) atau file XML (file yang memiliki ekstensi .resx). Anda kemudian mengkompilasi teks atau file XML dengan Resource File Generator (Resgen.exe) untuk membuat file .resources biner. Anda kemudian dapat menyematkan file .resources yang dihasilkan dalam file yang dapat dieksekusi atau pustaka dengan menggunakan opsi pengkompilasi seperti /resources untuk pengkompilasi C# dan Visual Basic, atau Anda dapat menyematkannya dalam rakitan satelit dengan menggunakan Assembly Linker (AI.exe). Jika Anda menyertakan file .resx dalam proyek Visual Studio, Visual Studio menangani kompilasi dan penyematan sumber daya default dan yang dilokalkan secara otomatis sebagai bagian dari proses build.

Idealnya, Anda harus membuat sumber daya untuk setiap bahasa yang didukung aplikasi Anda, atau setidaknya untuk subset yang bermakna dari setiap bahasa. Nama file .resources biner mengikuti nama dasar konvensi penamaan.cultureName.resources, di mana basename adalah nama aplikasi atau nama kelas, tergantung pada tingkat detail yang Anda inginkan. Properti CultureInfo.Name digunakan untuk menentukan cultureName. Sumber daya untuk budaya default aplikasi harus diberi nama basename.resources.

Misalnya, rakitan memiliki beberapa sumber daya dalam file sumber daya yang memiliki nama dasar MyResources. File sumber daya ini harus memiliki nama seperti MyResources.ja-JP.resources untuk budaya Jepang (Jepang), MyResources.de.resources untuk budaya Jerman, MyResources.zh-CHS.resources untuk budaya Cina yang disederhanakan, dan myResources.fr-BE.resources untuk budaya Prancis (Belgia). File sumber daya default harus bernama MyResources.resources. File sumber daya khusus budaya umumnya dipaketkan dalam rakitan satelit untuk setiap budaya. File sumber daya default harus disematkan di assembly utama aplikasi.

Perhatikan bahwa Assembly Linker memungkinkan sumber daya ditandai sebagai privat, tetapi Anda harus selalu menandainya sebagai publik sehingga dapat diakses oleh rakitan lain. (Karena rakitan satelit tidak berisi kode, sumber daya yang ditandai sebagai privat tidak tersedia untuk aplikasi Anda melalui mekanisme apa pun.)

Untuk informasi selengkapnya tentang membuat, mengemas, dan menyebarkan sumber daya, lihat artikel Membuat File Sumber Daya, Membuat Rakitan Satelit, dan Mengemas dan Menyebarkan Sumber Daya.

Membuat instans objek ResourceManager

Anda membuat instans ResourceManager objek yang mengambil sumber daya dari file .resources yang disematkan dengan memanggil salah satu overload konstruktor kelasnya. Ini menggabungkan ResourceManager objek dengan file .resources tertentu dan dengan file .resources yang dilokalkan terkait dalam rakitan satelit.

Dua konstruktor yang paling sering disebut adalah:

  • ResourceManager(String, Assembly) mencari sumber daya berdasarkan dua informasi yang Anda berikan: nama dasar file .resources, dan assembly tempat file .resources default berada. Nama dasar mencakup namespace layanan dan nama akar file .resources, tanpa kultur atau ekstensinya. Perhatikan bahwa file .resources yang dikompilasi dari baris perintah biasanya tidak menyertakan nama namespace, sedangkan file .resources yang dibuat di lingkungan Visual Studio melakukannya. Misalnya, jika file sumber daya bernama MyCompany.StringResources.resources dan ResourceManager konstruktor dipanggil dari metode statis bernama Example.Main, kode berikut membuat instans ResourceManager objek yang dapat mengambil sumber daya dari file .resources:

    ResourceManager rm = new ResourceManager("MyCompany.StringResources",
                                             typeof(Example).Assembly);
    
    Dim rm As New ResourceManager("MyCompany.StringResources",
                                GetType(Example2).Assembly)
    
  • ResourceManager(Type) mencari sumber daya di rakitan satelit berdasarkan informasi dari objek jenis. Nama tipe yang sepenuhnya memenuhi syarat sesuai dengan nama dasar file .resources tanpa ekstensi nama filenya. Di aplikasi desktop yang dibuat dengan menggunakan Visual Studio Resource Designer, Visual Studio membuat kelas pembungkus yang namanya sepenuhnya memenuhi syarat sama dengan nama akar file .resources. Misalnya, jika file sumber daya bernama MyCompany.StringResources.resources dan ada kelas pembungkus bernama MyCompany.StringResources, kode berikut membuat instans ResourceManager objek yang dapat mengambil sumber daya dari file .resources:

    ResourceManager rm = new ResourceManager(typeof(MyCompany.StringResources));
    
    Dim rm As New ResourceManager(GetType(MyCompany.StringResources))
    

Jika sumber daya yang sesuai tidak dapat ditemukan, panggilan konstruktor membuat objek yang valid ResourceManager . Namun, upaya untuk mengambil sumber daya melemparkan MissingManifestResourceException pengecualian. Untuk informasi tentang menangani pengecualian, lihat bagian Menangani MissingManifestResourceException dan MissingSatelliteAssemblyException Exceptions nanti di artikel ini.

Contoh berikut menunjukkan cara membuat instans ResourceManager objek. Ini berisi kode sumber untuk executable bernama ShowTime.exe. Ini juga mencakup file teks berikut bernama Strings.txt yang berisi satu sumber daya string, TimeHeader:

TimeHeader=The current time is

Anda dapat menggunakan file batch untuk menghasilkan file sumber daya dan menyematkannya ke dalam file yang dapat dieksekusi. Berikut adalah file batch untuk menghasilkan executable dengan menggunakan pengkompilasi C#:

resgen strings.txt
csc ShowTime.cs /resource:strings.resources

Untuk pengkompilasi Visual Basic, Anda bisa menggunakan file batch berikut:

resgen strings.txt
vbc ShowTime.vb /resource:strings.resources
using System;
using System.Resources;

public class ShowTimeEx
{
    public static void Main()
    {
        ResourceManager rm = new ResourceManager("Strings",
                                 typeof(Example).Assembly);
        string timeString = rm.GetString("TimeHeader");
        Console.WriteLine("{0} {1:T}", timeString, DateTime.Now);
    }
}
// The example displays output like the following:
//        The current time is 2:03:14 PM
Imports System.Resources

Module Example6
    Public Sub Main()
        Dim rm As New ResourceManager("Strings", GetType(Example6).Assembly)
        Dim timeString As String = rm.GetString("TimeHeader")
        Console.WriteLine("{0} {1:T}", timeString, Date.Now)
    End Sub
End Module
' The example displays output similar to the following:
'       The current time is 2:03:14 PM

ResourceManager dan sumber daya khusus budaya

Aplikasi yang dilokalkan memerlukan sumber daya untuk disebarkan, seperti yang dibahas dalam artikel Mengemas dan Menyebarkan Sumber Daya. Jika rakitan dikonfigurasi dengan benar, resource manager menentukan sumber daya mana yang akan diambil berdasarkan properti utas Thread.CurrentUICulture saat ini. (Properti itu juga mengembalikan budaya UI utas saat ini.) Misalnya, jika aplikasi dikompilasi dengan sumber daya bahasa Inggris default di perakitan utama dan dengan sumber daya bahasa Prancis dan Rusia dalam dua rakitan satelit, dan Thread.CurrentUICulture properti diatur ke fr-FR, manajer sumber daya mengambil sumber daya Prancis.

Anda dapat mengatur CurrentUICulture properti secara eksplisit atau implisit. Cara Anda mengaturnya menentukan bagaimana ResourceManager objek mengambil sumber daya berdasarkan budaya:

  • Jika Anda secara eksplisit mengatur Thread.CurrentUICulture properti ke budaya tertentu, manajer sumber daya selalu mengambil sumber daya untuk budaya tersebut, terlepas dari browser pengguna atau bahasa sistem operasi. Pertimbangkan aplikasi yang dikompilasi dengan sumber daya bahasa Inggris default dan tiga rakitan satelit yang berisi sumber daya untuk bahasa Inggris (Amerika Serikat), Prancis (Prancis), dan Rusia (Rusia). CurrentUICulture Jika properti diatur ke fr-FR, ResourceManager objek selalu mengambil sumber daya Prancis (Prancis), bahkan jika bahasa sistem operasi pengguna bukan bahasa Prancis. Pastikan bahwa ini adalah perilaku yang diinginkan sebelum Anda mengatur properti secara eksplisit.

    Di aplikasi ASP.NET, Anda harus mengatur Thread.CurrentUICulture properti secara eksplisit, karena tidak mungkin pengaturan di server akan cocok dengan permintaan klien masuk. Aplikasi ASP.NET dapat mengatur Thread.CurrentUICulture properti secara eksplisit ke bahasa penerima browser pengguna.

    Secara eksplisit mengatur Thread.CurrentUICulture properti menentukan budaya UI saat ini untuk utas tersebut. Ini tidak memengaruhi budaya UI saat ini dari utas lain dalam aplikasi.

  • Anda dapat mengatur budaya UI dari semua utas di domain aplikasi dengan menetapkan CultureInfo objek yang mewakili budaya tersebut ke properti statis CultureInfo.DefaultThreadCurrentUICulture .

  • Jika Anda tidak secara eksplisit mengatur budaya UI saat ini dan Anda tidak menentukan budaya default untuk domain aplikasi saat ini, CultureInfo.CurrentUICulture properti diatur secara implisit oleh fungsi Windows GetUserDefaultUILanguage . Fungsi ini disediakan oleh Antarmuka Pengguna Multibahasa (MUI), yang memungkinkan pengguna untuk mengatur bahasa default. Jika bahasa UI tidak diatur oleh pengguna, bahasa tersebut default ke bahasa yang diinstal sistem, yang merupakan bahasa sumber daya sistem operasi.

Contoh "Halo dunia" sederhana berikut menetapkan budaya UI saat ini secara eksplisit. Ini berisi sumber daya untuk tiga budaya: Inggris (Amerika Serikat) atau en-AS, Prancis (Prancis) atau fr-FR, dan Rusia (Rusia) atau ru-RU. Sumber daya en-US terkandung dalam file teks bernama Greetings.txt:

HelloString=Hello world!

Sumber daya fr-FR terkandung dalam file teks bernama Greetings.fr-FR.txt:

HelloString=Salut tout le monde!

Sumber daya ru-RU terkandung dalam file teks bernama Greetings.ru-RU.txt:

HelloString=Всем привет!

Berikut adalah kode sumber untuk contoh (Example.vb untuk versi Visual Basic atau Example.cs untuk versi C#):

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

public class Example
{
    public 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;
        ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly);
        try
        {
            CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
            Thread.CurrentThread.CurrentCulture = newCulture;
            Thread.CurrentThread.CurrentUICulture = newCulture;
            string greeting = String.Format("The current culture is {0}.\n{1}",
                                            Thread.CurrentThread.CurrentUICulture.Name,
                                            rm.GetString("HelloString"));
            Console.WriteLine(greeting);
        }
        catch (CultureNotFoundException e)
        {
            Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
        }
        finally
        {
            Thread.CurrentThread.CurrentCulture = originalCulture;
            Thread.CurrentThread.CurrentUICulture = originalCulture;
        }
    }
}
// The example displays output like the following:
//       The current culture is ru-RU.
//       Всем привет!
Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Example
   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
      Dim rm As New ResourceManager("Greetings", GetType(Example).Assembly)
      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, rm.GetString("HelloString"))

         Console.WriteLine(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
' The example displays output like the following:
'       The current culture is ru-RU.
'       Всем привет!

Untuk mengkompilasi contoh ini, buat file batch (.bat) yang berisi perintah berikut dan jalankan dari prompt perintah. Jika Anda menggunakan C#, tentukan csc alih-alih vbc dan Example.cs bukan Example.vb.

resgen Greetings.txt
vbc Example.vb /resource:Greetings.resources

resgen Greetings.fr-FR.txt
Md fr-FR
al /embed:Greetings.fr-FR.resources /culture:fr-FR /out:fr-FR\Example.resources.dll

resgen Greetings.ru-RU.txt
Md ru-RU
al /embed:Greetings.ru-RU.resources /culture:ru-RU /out:ru-RU\Example.resources.dll

Mengambil sumber daya

Anda memanggil GetObject(String) metode dan GetString(String) untuk mengakses sumber daya tertentu. Anda juga dapat memanggil GetStream(String) metode untuk mengambil sumber daya non-string sebagai array byte. Secara default, dalam aplikasi yang memiliki sumber daya yang dilokalkan, metode ini mengembalikan sumber daya untuk budaya yang ditentukan oleh budaya UI utas saat ini yang melakukan panggilan. Lihat bagian sebelumnya, ResourceManager, dan sumber daya khusus budaya, untuk informasi selengkapnya tentang bagaimana budaya UI utas saat ini ditentukan. Jika resource manager tidak dapat menemukan sumber daya untuk budaya UI utas saat ini, sumber daya tersebut menggunakan proses fallback untuk mengambil sumber daya yang ditentukan. Jika resource manager tidak dapat menemukan sumber daya yang dilokalkan, resource manager menggunakan sumber daya budaya default. Untuk informasi selengkapnya tentang aturan fallback sumber daya, lihat bagian "Proses Fallback Sumber Daya" dari artikel Mengemas dan Menyebarkan Sumber Daya.

Catatan

Jika file .resources yang ditentukan dalam ResourceManager konstruktor kelas tidak dapat ditemukan, upaya untuk mengambil sumber daya akan melemparkan MissingManifestResourceException atau MissingSatelliteAssemblyException pengecualian. Untuk informasi tentang menangani pengecualian, lihat bagian Menangani MissingManifestResourceException dan MissingSatelliteAssemblyException Exceptions nanti di artikel ini.

Contoh berikut menggunakan GetString metode untuk mengambil sumber daya khusus budaya. Ini terdiri dari sumber daya yang dikompilasi dari file .txt untuk budaya Inggris (en), Prancis (Prancis) (fr-FR), dan Rusia (Rusia) (ru-RU). Contohnya mengubah budaya saat ini dan budaya UI saat ini menjadi Bahasa Inggris (Amerika Serikat), Prancis (Prancis), Rusia (Rusia), dan Swedia (Swedia). Kemudian memanggil GetString metode untuk mengambil string yang dilokalkan, yang ditampilkan bersama dengan hari dan bulan saat ini. Perhatikan bahwa output menampilkan string yang dilokalkan yang sesuai kecuali ketika budaya UI saat ini adalah Swedia (Swedia). Karena sumber daya bahasa Swedia tidak tersedia, aplikasi ini menggunakan sumber daya budaya default, yaitu bahasa Inggris.

Contoh ini memerlukan file sumber daya berbasis teks yang tercantum dalam tabel berikut. Masing-masing memiliki satu sumber daya string bernama DateStart.

Kultur Nama file Nama sumber daya Nilai sumber daya
id-ID DateStrings.txt DateStart Hari ini adalah
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

Berikut adalah kode sumber untuk contoh (ShowDate.vb untuk versi Visual Basic atau ShowDate.cs untuk versi C# kode).

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

[assembly: NeutralResourcesLanguage("en")]

public class ShowDateEx
{
    public static void Main()
    {
        string[] cultureNames = { "en-US", "fr-FR", "ru-RU", "sv-SE" };
        ResourceManager rm = new ResourceManager("DateStrings",
                                                 typeof(Example).Assembly);

        foreach (var cultureName in cultureNames)
        {
            CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;

            Console.WriteLine("Current UI Culture: {0}",
                              CultureInfo.CurrentUICulture.Name);
            string dateString = rm.GetString("DateStart");
            Console.WriteLine("{0} {1:M}.\n", dateString, DateTime.Now);
        }
    }
}
// The example displays output similar to the following:
//       Current UI Culture: en-US
//       Today is February 03.
//       
//       Current UI Culture: fr-FR
//       Aujourd'hui, c'est le 3 février
//       
//       Current UI Culture: ru-RU
//       Сегодня февраля 03.
//       
//       Current UI Culture: sv-SE
//       Today is den 3 februari.
Imports System.Globalization
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example5
    Public Sub Main()
        Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE"}
        Dim rm As New ResourceManager("DateStrings",
                                    GetType(Example5).Assembly)

        For Each cultureName In cultureNames
            Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
            Thread.CurrentThread.CurrentCulture = culture
            Thread.CurrentThread.CurrentUICulture = culture

            Console.WriteLine("Current UI Culture: {0}",
                           CultureInfo.CurrentUICulture.Name)
            Dim dateString As String = rm.GetString("DateStart")
            Console.WriteLine("{0} {1:M}.", dateString, Date.Now)
            Console.WriteLine()
        Next
    End Sub
End Module
' The example displays output similar to the following:
'       Current UI Culture: en-US
'       Today is February 03.
'       
'       Current UI Culture: fr-FR
'       Aujourd'hui, c'est le 3 février
'       
'       Current UI Culture: ru-RU
'       Сегодня февраля 03.
'       
'       Current UI Culture: sv-SE
'       Today is den 3 februari.

Untuk mengkompilasi contoh ini, buat file batch yang berisi perintah berikut dan jalankan dari prompt perintah. Jika Anda menggunakan C#, tentukan csc alih-alih vbc dan showdate.cs bukan showdate.vb.

resgen DateStrings.txt
vbc showdate.vb /resource:DateStrings.resources

md fr-FR
resgen DateStrings.fr-FR.txt
al /out:fr-FR\Showdate.resources.dll /culture:fr-FR /embed:DateStrings.fr-FR.resources

md ru-RU
resgen DateStrings.ru-RU.txt
al /out:ru-RU\Showdate.resources.dll /culture:ru-RU /embed:DateStrings.ru-RU.resources

Ada dua cara untuk mengambil sumber daya budaya tertentu selain budaya UI saat ini:

  • Anda dapat memanggil GetString(String, CultureInfo)metode , GetObject(String, CultureInfo), atau GetStream(String, CultureInfo) untuk mengambil sumber daya untuk budaya tertentu. Jika sumber daya yang dilokalkan tidak dapat ditemukan, resource manager menggunakan proses fallback sumber daya untuk menemukan sumber daya yang sesuai.
  • Anda dapat memanggil GetResourceSet metode untuk mendapatkan ResourceSet objek yang mewakili sumber daya untuk budaya tertentu. Dalam panggilan metode, Anda dapat menentukan apakah manajer sumber daya menyelidiki budaya induk jika tidak dapat menemukan sumber daya yang dilokalkan, atau apakah itu hanya jatuh kembali ke sumber daya budaya default. Anda kemudian dapat menggunakan ResourceSet metode untuk mengakses sumber daya (dilokalkan untuk budaya tersebut) berdasarkan nama, atau untuk menghitung sumber daya dalam set.

Menangani pengecualian MissingManifestResourceException dan MissingSatelliteAssemblyException

Jika Anda mencoba mengambil sumber daya tertentu, tetapi manajer sumber daya tidak dapat menemukan sumber daya tersebut dan tidak ada budaya default yang telah ditentukan atau sumber daya budaya default tidak dapat ditemukan, manajer sumber daya melemparkan MissingManifestResourceException pengecualian jika mengharapkan untuk menemukan sumber daya di perakitan utama atau MissingSatelliteAssemblyException jika mengharapkan untuk menemukan sumber daya dalam rakitan satelit. Perhatikan bahwa pengecualian dilemparkan saat Anda memanggil metode pengambilan sumber daya seperti GetString atau GetObject, dan bukan saat Anda membuat ResourceManager instans objek.

Pengecualian biasanya dilemparkan dalam kondisi berikut:

  • File sumber daya atau rakitan satelit yang sesuai tidak ada. Jika resource manager mengharapkan sumber daya default aplikasi disematkan di perakitan aplikasi utama, sumber daya tersebut tidak ada. NeutralResourcesLanguageAttribute Jika atribut menunjukkan bahwa sumber daya default aplikasi berada di rakitan satelit, rakitan tersebut tidak dapat ditemukan. Saat Anda mengkompilasi aplikasi, pastikan sumber daya disematkan di assembly utama atau bahwa rakitan satelit yang diperlukan dihasilkan dan diberi nama dengan tepat. Namanya harus menggunakan appName formulir.resources.dll, dan harus terletak di direktori yang dinamai sesuai dengan budaya yang sumber dayanya dikandungnya.

  • Aplikasi Anda tidak memiliki budaya default atau netral yang ditentukan. NeutralResourcesLanguageAttribute Tambahkan atribut ke file kode sumber atau ke file informasi proyek (AssemblyInfo.vb untuk aplikasi Visual Basic atau AssemblyInfo.cs untuk aplikasi C#).

  • Parameter baseName dalam ResourceManager(String, Assembly) konstruktor tidak menentukan nama file .resources. Nama harus menyertakan namespace file sumber daya yang sepenuhnya memenuhi syarat tetapi bukan ekstensi nama filenya. Biasanya, file sumber daya yang dibuat di Visual Studio menyertakan nama namespace layanan, tetapi file sumber daya yang dibuat dan dikompilasi pada prompt perintah tidak. Anda dapat menentukan nama file .resources yang disematkan dengan mengkompilasi dan menjalankan utilitas berikut. Ini adalah aplikasi konsol yang menerima nama rakitan utama atau rakitan satelit sebagai parameter baris perintah. Ini menampilkan string yang harus disediakan sebagai baseName parameter sehingga manajer sumber daya dapat mengidentifikasi sumber daya dengan benar.

    using System;
    using System.IO;
    using System.Reflection;
    
    public class Example0
    {
       public static void Main()
       {
          if (Environment.GetCommandLineArgs().Length == 1) { 
             Console.WriteLine("No filename.");
             return;
          }
          
          string filename = Environment.GetCommandLineArgs()[1].Trim();
          // Check whether the file exists.
          if (! File.Exists(filename)) {
             Console.WriteLine("{0} does not exist.", filename);
             return;
          }   
          
          // Try to load the assembly.
          Assembly assem = Assembly.LoadFrom(filename);
          Console.WriteLine("File: {0}", filename);
             
          // Enumerate the resource files.
          string[] resNames = assem.GetManifestResourceNames();
          if (resNames.Length == 0)
             Console.WriteLine("   No resources found.");
    
          foreach (var resName in resNames)
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""));
    
          Console.WriteLine();
       }
    }
    
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    
    Module Example
       Public Sub Main()
          If Environment.GetCommandLineArgs.Length = 1 Then 
             Console.WriteLine("No filename.")
             Exit Sub
          End If
          Dim filename As String = Environment.GetCommandLineArgs(1).Trim()
          ' Check whether the file exists.
          If Not File.Exists(filename) Then
             Console.WriteLine("{0} does not exist.", filename)
             Exit Sub
          End If   
          
          ' Try to load the assembly.
          Dim assem As Assembly = Assembly.LoadFrom(filename)
          Console.WriteLine("File: {0}", filename)
             
          ' Enumerate the resource files.
          Dim resNames() As String = assem.GetManifestResourceNames()
          If resNames.Length = 0 Then
             Console.WriteLine("   No resources found.")
          End If
          For Each resName In resNames
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""))
          Next
          Console.WriteLine()
       End Sub
    End Module
    

Jika Anda mengubah budaya aplikasi Anda saat ini secara eksplisit, Anda juga harus ingat bahwa manajer sumber daya mengambil set sumber daya berdasarkan nilai CultureInfo.CurrentUICulture properti, dan bukan CultureInfo.CurrentCulture properti . Biasanya, jika Anda mengubah satu nilai, Anda juga harus mengubah nilai lainnya.

Penerapan versi sumber daya

Karena rakitan utama yang berisi sumber daya default aplikasi terpisah dari rakitan satelit aplikasi, Anda dapat merilis versi baru rakitan utama Anda tanpa menyebarkan ulang rakitan satelit. Anda menggunakan SatelliteContractVersionAttribute atribut untuk menggunakan rakitan satelit yang ada dan menginstruksikan manajer sumber daya untuk tidak menyebarkannya kembali dengan versi baru rakitan utama Anda,

Untuk informasi selengkapnya tentang dukungan penerapan versi untuk rakitan satelit, lihat artikel Mengambil Sumber Daya.

<simpul file konfigurasi satelliteassemblies>

Catatan

Bagian ini khusus untuk aplikasi .NET Framework.

Untuk executable yang disebarkan dan dijalankan dari situs web (file .exe HREF), ResourceManager objek dapat menyelidiki rakitan satelit melalui web, yang dapat merusak performa aplikasi Anda. Untuk menghilangkan masalah performa, Anda dapat membatasi pemeriksaan ini ke rakitan satelit yang telah Anda sebarkan dengan aplikasi Anda. Untuk melakukan ini, Anda membuat simpul <satelliteassemblies> di file konfigurasi aplikasi untuk menentukan bahwa Anda telah menyebarkan sekumpulan budaya tertentu untuk aplikasi Anda, dan bahwa objek tidak boleh mencoba menyelidiki budaya apa pun yang tidak tercantum dalam simpul tersebut ResourceManager .

Catatan

Alternatif yang disukai untuk membuat simpul <satelliteassemblies> adalah menggunakan fitur Manifes Penyebaran ClickOnce.

Di file konfigurasi aplikasi Anda, buat bagian yang mirip dengan yang berikut ini:

<?xml version ="1.0"?>
<configuration>
  <satelliteassemblies>
    <assembly name="MainAssemblyName, Version=versionNumber, Culture=neutral, PublicKeyToken=null|yourPublicKeyToken">
      <culture>cultureName1</culture>
      <culture>cultureName2</culture>
      <culture>cultureName3</culture>
    </assembly>
  </satelliteassemblies>
</configuration>

Edit informasi konfigurasi ini sebagai berikut:

  • Tentukan satu atau beberapa <assembly> simpul untuk setiap rakitan utama yang Anda sebarkan, di mana setiap simpul menentukan nama rakitan yang sepenuhnya memenuhi syarat. Tentukan nama assembly utama Anda sebagai pengganti MainAssemblyName, dan tentukan Versionnilai atribut , , PublicKeyTokendan Culture yang sesuai dengan assembly utama Anda.

    Version Untuk atribut , tentukan nomor versi assembly Anda. Misalnya, rilis pertama rakitan Anda mungkin adalah nomor versi 1.0.0.0.

    PublicKeyToken Untuk atribut , tentukan kata kunci null jika Anda belum menandatangani assembly Anda dengan nama yang kuat, atau tentukan token kunci publik Anda jika Anda telah menandatangani assembly Anda.

    Culture Untuk atribut , tentukan kata kunci neutral untuk menunjuk perakitan utama dan menyebabkan ResourceManager kelas hanya menyelidiki budaya yang tercantum dalam simpul<culture>.

    Untuk informasi selengkapnya tentang nama rakitan yang sepenuhnya memenuhi syarat, lihat artikel Nama Rakitan. Untuk informasi selengkapnya tentang rakitan bernama kuat, lihat artikel Membuat dan menggunakan rakitan bernama kuat.

  • Tentukan satu atau beberapa <culture> simpul dengan nama budaya tertentu, seperti "fr-FR", atau nama budaya netral, seperti "fr".

Jika sumber daya diperlukan untuk rakitan apa pun yang tidak tercantum di bawah <satelliteassemblies> simpul, ResourceManager kelas menyelidiki budaya menggunakan aturan pemeriksaan standar.

Aplikasi Windows 8.x

Penting

ResourceManager Meskipun kelas didukung di aplikasi Windows 8.x, kami tidak merekomendasikan penggunaannya. Gunakan kelas ini hanya saat Anda mengembangkan proyek Pustaka Kelas Portabel yang dapat digunakan dengan aplikasi Windows 8.x. Untuk mengambil sumber daya dari aplikasi Windows 8.x, gunakan kelas Windows.ApplicationModel.Resources.ResourceLoader sebagai gantinya.

Untuk aplikasi Windows 8.x, ResourceManager kelas mengambil sumber daya dari file indeks sumber daya paket (PRI). Satu file PRI (file PRI paket aplikasi) berisi sumber daya untuk budaya default dan budaya yang dilokalkan. Anda menggunakan utilitas MakePRI untuk membuat file PRI dari satu atau beberapa file sumber daya yang dalam format sumber daya XML (.resw). Untuk sumber daya yang disertakan dalam proyek Visual Studio, Visual Studio menangani proses pembuatan dan pengemasan file PRI secara otomatis. Anda kemudian dapat menggunakan kelas .NET ResourceManager untuk mengakses sumber daya aplikasi atau pustaka.

Anda dapat membuat ResourceManager instans objek untuk aplikasi Windows 8.x dengan cara yang sama seperti yang Anda lakukan untuk aplikasi desktop.

Anda kemudian dapat mengakses sumber daya untuk budaya tertentu dengan meneruskan nama sumber daya yang akan diambil ke metode .GetString(String) Secara default, metode ini mengembalikan sumber daya untuk budaya yang ditentukan oleh budaya UI saat ini dari utas yang melakukan panggilan. Anda juga dapat mengambil sumber daya untuk budaya tertentu dengan meneruskan nama sumber daya dan CultureInfo objek yang mewakili budaya yang sumber dayanya akan diambil ke metode .GetString(String, CultureInfo) Jika sumber daya untuk budaya UI saat ini atau budaya yang ditentukan tidak dapat ditemukan, resource manager menggunakan daftar fallback bahasa UI untuk menemukan sumber daya yang sesuai.

Contoh

Contoh berikut menunjukkan cara menggunakan budaya eksplisit dan budaya UI implisit saat ini untuk mendapatkan sumber daya string dari assembly utama dan rakitan satelit. Untuk informasi selengkapnya, lihat bagian "Lokasi Direktori untuk Rakitan Satelit Tidak Diinstal di Cache Rakitan Global" dari topik Membuat Rakitan Satelit.

Untuk menjalankan contoh ini:

  1. Di direktori aplikasi, buat file bernama rmc.txt yang berisi string sumber daya berikut:

    day=Friday
    year=2006
    holiday="Cinco de Mayo"
    
  2. Gunakan Generator File Sumber Daya untuk menghasilkan file sumber daya rmc.resources dari file input rmc.txt sebagai berikut:

    resgen rmc.txt
    
  3. Buat subdirektori direktori aplikasi dan beri nama "es-MX". Ini adalah nama budaya rakitan satelit yang akan Anda buat dalam tiga langkah berikutnya.

  4. Buat file bernama rmc.es-MX.txt di direktori es-MX yang berisi string sumber daya berikut:

    day=Viernes
    year=2006
    holiday="Cinco de Mayo"
    
  5. Gunakan Generator File Sumber Daya untuk menghasilkan file sumber daya rmc.es-MX.resources dari file input rmc.es-MX.txt sebagai berikut:

    resgen rmc.es-MX.txt
    
  6. Asumsikan bahwa nama file untuk contoh ini rmc.vb atau rmc.cs. Salin kode sumber berikut ke dalam file. Kemudian kompilasi dan sematkan file sumber daya rakitan utama, rmc.resources, di rakitan yang dapat dieksekusi. Jika Anda menggunakan pengkompilasi Visual Basic, sintaksnya adalah:

    vbc rmc.vb /resource:rmc.resources
    

    Sintaks yang sesuai untuk pengkompilasi C# adalah:

    csc /resource:rmc.resources rmc.cs
    
  7. Gunakan Assembly Linker untuk membuat rakitan satelit. Jika nama dasar aplikasi adalah rmc, nama rakitan satelit harus rmc.resources.dll. Rakitan satelit harus dibuat di direktori es-MX. Jika es-MX adalah direktori saat ini, gunakan perintah ini:

    al /embed:rmc.es-MX.resources /c:es-MX /out:rmc.resources.dll
    
  8. Jalankan rmc.exe untuk mendapatkan dan menampilkan string sumber daya yang disematkan.

    using System;
    using System.Globalization;
    using System.Resources;
    
    class Example2
    {
        public static void Main()
        {
            string day;
            string year;
            string holiday;
            string celebrate = "{0} will occur on {1} in {2}.\n";
    
            // Create a resource manager.
            ResourceManager rm = new ResourceManager("rmc",
                                     typeof(Example).Assembly);
    
            Console.WriteLine("Obtain resources using the current UI culture.");
    
            // Get the resource strings for the day, year, and holiday
            // using the current UI culture.
            day = rm.GetString("day");
            year = rm.GetString("year");
            holiday = rm.GetString("holiday");
            Console.WriteLine(celebrate, holiday, day, year);
    
            // Obtain the es-MX culture.
            CultureInfo ci = new CultureInfo("es-MX");
    
            Console.WriteLine("Obtain resources using the es-MX culture.");
    
            // Get the resource strings for the day, year, and holiday
            // using the specified culture.
            day = rm.GetString("day", ci);
            year = rm.GetString("year", ci);
            holiday = rm.GetString("holiday", ci);
            // ---------------------------------------------------------------
            // Alternatively, comment the preceding 3 code statements and
            // uncomment the following 4 code statements:
            // ----------------------------------------------------------------
            // Set the current UI culture to "es-MX" (Spanish-Mexico).
            //    Thread.CurrentThread.CurrentUICulture = ci;
    
            // Get the resource strings for the day, year, and holiday
            // using the current UI culture. Use those strings to
            // display a message.
            //    day  = rm.GetString("day");
            //    year = rm.GetString("year");
            //    holiday = rm.GetString("holiday");
            // ---------------------------------------------------------------
    
            // Regardless of the alternative that you choose, display a message
            // using the retrieved resource strings.
            Console.WriteLine(celebrate, holiday, day, year);
        }
    }
    /*
    This example displays the following output:
    
       Obtain resources using the current UI culture.
       "5th of May" will occur on Friday in 2006.
    
       Obtain resources using the es-MX culture.
       "Cinco de Mayo" will occur on Viernes in 2006.
    */
    
    Imports System.Resources
    Imports System.Reflection
    Imports System.Threading
    Imports System.Globalization
    
    Class Example4
        Public Shared Sub Main()
            Dim day As String
            Dim year As String
            Dim holiday As String
            Dim celebrate As String = "{0} will occur on {1} in {2}." & vbCrLf
    
            ' Create a resource manager. 
            Dim rm As New ResourceManager("rmc", GetType(Example4).Assembly)
    
            Console.WriteLine("Obtain resources using the current UI culture.")
    
            ' Get the resource strings for the day, year, and holiday 
            ' using the current UI culture. 
            day = rm.GetString("day")
            year = rm.GetString("year")
            holiday = rm.GetString("holiday")
            Console.WriteLine(celebrate, holiday, day, year)
    
            ' Obtain the es-MX culture.
            Dim ci As New CultureInfo("es-MX")
    
            Console.WriteLine("Obtain resources using the es-MX culture.")
    
            ' Get the resource strings for the day, year, and holiday 
            ' using the es-MX culture.  
            day = rm.GetString("day", ci)
            year = rm.GetString("year", ci)
            holiday = rm.GetString("holiday", ci)
    
            ' ---------------------------------------------------------------
            ' Alternatively, comment the preceding 3 code statements and 
            ' uncomment the following 4 code statements:
            ' ----------------------------------------------------------------
            ' Set the current UI culture to "es-MX" (Spanish-Mexico).
            '    Thread.CurrentThread.CurrentUICulture = ci
            ' Get the resource strings for the day, year, and holiday 
            ' using the current UI culture. 
            '    day  = rm.GetString("day")
            '    year = rm.GetString("year")
            '    holiday = rm.GetString("holiday")
            ' ---------------------------------------------------------------
    
            ' Regardless of the alternative that you choose, display a message 
            ' using the retrieved resource strings.
            Console.WriteLine(celebrate, holiday, day, year)
        End Sub
    End Class
    ' This example displays the following output:
    'Obtain resources using the current UI culture.
    '"5th of May" will occur on Friday in 2006.
    '
    'Obtain resources using the es-MX culture.
    '"Cinco de Mayo" will occur on Viernes in 2006.