System.Resources.ResourceManager sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Önemli

Güvenilmeyen verilerle bu sınıftan yöntemleri çağırmak bir güvenlik riskidir. Bu sınıftaki yöntemleri yalnızca güvenilen verilerle çağırın. Daha fazla bilgi için bkz . Tüm Girişleri Doğrulama.

sınıfı, ResourceManager bir derlemeye katıştırılmış ikili .resources dosyasından veya tek başına bir .resources dosyasından kaynakları alır. Bir uygulama yerelleştirilmişse ve yerelleştirilmiş kaynaklar uydu derlemelerinde dağıtıldıysa, kültüre özgü kaynakları arar, yerelleştirilmiş bir kaynak olmadığında kaynak geri dönüşü sağlar ve kaynak serileştirmeyi destekler.

Masaüstü uygulamaları

Masaüstü uygulamaları için ResourceManager sınıfı, ikili kaynak (.resources) dosyalarından kaynakları alır. Genellikle bir dil derleyicisi veya Derleme Bağlayıcısı (AL.exe) bu kaynak dosyalarını bir derlemeye ekler. Ayrıca, ResourceManager yöntemini çağırarak CreateFileBasedResourceManager bir derlemeye katıştırılmayan bir .resources dosyasından kaynakları doğrudan almak için bir nesnesi de kullanabilirsiniz.

Dikkat

Tek başına .resources dosyalarının bir ASP.NET uygulamasında kullanılması XCOPY dağıtımını bozar, çünkü kaynaklar yöntemi tarafından ReleaseAllResources açıkça yayımlanana kadar kilitli kalır. kaynakları ASP.NET uygulamalarınızla dağıtmak istiyorsanız,.resources dosyalarınızı uydu derlemeleri halinde derlemelisiniz.

Kaynak tabanlı bir uygulamada, bir .resources dosyası, kültüre özgü kaynaklar bulunamazsa kaynakları kullanılan varsayılan kültürün kaynaklarını içerir. Örneğin, bir uygulamanın varsayılan kültürü İngilizce (en) ise, İngilizce (Birleşik Devletler) (en-US) veya Fransızca (Fransa) (fr-FR) gibi belirli bir kültür için yerelleştirilmiş kaynaklar bulunamadığında İngilizce dil kaynakları kullanılır. Genellikle, varsayılan kültürün kaynakları ana uygulama derlemesine eklenir ve diğer yerelleştirilmiş kültürlere yönelik kaynaklar uydu derlemelerine eklenir. Uydu derlemeleri yalnızca kaynakları içerir. Ana derlemeyle aynı kök dosya adına ve .resources.dll uzantısına sahiptirler. Derlemeleri genel derleme önbelleğine kaydedilmeyen uygulamalar için, uydu derlemeleri adı derlemenin kültürüne karşılık gelen bir uygulama alt dizininde depolanır.

Kaynak oluşturma

Kaynak tabanlı bir uygulama geliştirirken, kaynak bilgilerini metin dosyalarında (.txt veya .restext uzantısına sahip dosyalar) veya XML dosyalarında (.resx uzantısına sahip dosyalar) depolarsınız. Ardından, ikili bir .resources dosyası oluşturmak için Kaynak Dosya Oluşturucu (Resgen.exe) ile metin veya XML dosyalarını derleyebilirsiniz. Daha sonra C# ve Visual Basic derleyicileri gibi /resources bir derleyici seçeneği kullanarak elde edilen .resources dosyasını yürütülebilir dosyaya veya kitaplığa ekleyebilir veya Derleme Bağlayıcısı'nı (AI.exe) kullanarak bir uydu derlemesine ekleyebilirsiniz. Visual Studio projenize bir .resx dosyası eklerseniz, Visual Studio derleme işleminin bir parçası olarak varsayılan ve yerelleştirilmiş kaynakların derlenmesini ve eklenmesini otomatik olarak işler.

İdeal olarak, uygulamanızın desteklediği her dil için veya en azından her dilin anlamlı bir alt kümesi için kaynaklar oluşturmanız gerekir. İkili .resources dosya adları, adlandırma kuralı temel adını izler.cultureName.resources; burada basename , istediğiniz ayrıntı düzeyine bağlı olarak uygulamanın adı veya sınıfın adıdır. CultureInfo.Name özelliği cultureName değerini belirlemek için kullanılır. Uygulamanın varsayılan kültürü için bir kaynağın adı basename.resources olmalıdır.

Örneğin, bir derlemenin kaynak dosyasında MyResources temel adına sahip birkaç kaynağı olduğunu varsayalım. Bu kaynak dosyaları, Japonya (Japon) kültürü için MyResources.ja-JP.resources, Alman kültürü için MyResources.de.resources, basitleştirilmiş Çin kültürü için MyResources.zh-CHS.resources ve Fransızca (Belçika) kültürü için MyResources.fr-BE.resources gibi adlara sahip olmalıdır. Varsayılan kaynak dosyası MyResources.resources olarak adlandırılmalıdır. Kültüre özgü kaynak dosyaları genellikle her kültür için uydu derlemelerinde paketlenir. Varsayılan kaynak dosyası uygulamanın ana derlemesine eklenmelidir.

Derleme Bağlayıcısı'nın kaynakların özel olarak işaretlenmesine izin verdiğine, ancak diğer derlemeler tarafından erişilebilmeleri için bunları her zaman genel olarak işaretlemeniz gerektiğine dikkat edin. (Uydu derlemesi kod içermediğinden, özel olarak işaretlenmiş kaynaklar herhangi bir mekanizma aracılığıyla uygulamanız için kullanılamaz.)

Kaynakları oluşturma, paketleme ve dağıtma hakkında daha fazla bilgi için Kaynak Dosyaları Oluşturma, Uydu Derlemeleri Oluşturma ve Kaynakları Paketleme ve Dağıtma makalelerine bakın.

ResourceManager nesnesi örneği oluşturma

Katıştırılmış bir .resources dosyasından kaynak alan bir ResourceManager nesnenin sınıf oluşturucu aşırı yüklemelerinden birini çağırarak örnek oluşturursunuz. Bu, bir nesneyi belirli bir .resources dosyasıyla ve uydu derlemelerindeki ilişkili yerelleştirilmiş .resources dosyalarıyla sıkı bir ResourceManager şekilde bağlar.

En yaygın olarak adlandırılan iki oluşturucu şunlardır:

  • ResourceManager(String, Assembly) sağladığınız iki bilgi parçasına göre kaynakları arar: .resources dosyasının temel adı ve varsayılan .resources dosyasının bulunduğu derleme. Temel ad, kültürü veya uzantısı olmadan .resources dosyasının ad alanını ve kök adını içerir. Komut satırından derlenen .resources dosyalarının genellikle ad alanı adı içermediğini, ancak Visual Studio ortamında oluşturulan .resources dosyalarının içermediğini unutmayın. Örneğin, kaynak dosyası MyCompany.StringResources.resources olarak adlandırılırsa ve ResourceManager oluşturucu adlı Example.Mainstatik bir yöntemden çağrılırsa, aşağıdaki kod .resources dosyasından kaynakları alabilen bir ResourceManager nesnenin örneğini oluşturur:

    ResourceManager rm = new ResourceManager("MyCompany.StringResources",
                                             typeof(Example).Assembly);
    
    Dim rm As New ResourceManager("MyCompany.StringResources",
                                GetType(Example2).Assembly)
    
  • ResourceManager(Type) bir tür nesnesinden alınan bilgilere göre uydu derlemelerindeki kaynakları arar. Türün tam adı, dosya adı uzantısı olmadan .resources dosyasının temel adına karşılık gelir. Visual Studio Kaynak Tasarım Aracı kullanılarak oluşturulan masaüstü uygulamalarında, Visual Studio tam adı .resources dosyasının kök adıyla aynı olan bir sarmalayıcı sınıfı oluşturur. Örneğin, kaynak dosyasının adı MyCompany.StringResources.resources ise ve adlı MyCompany.StringResourcesbir sarmalayıcı sınıfı varsa, aşağıdaki kod .resources dosyasından kaynak alabilen bir ResourceManager nesnenin örneğini oluşturur:

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

Uygun kaynaklar bulunamazsa oluşturucu çağrısı geçerli ResourceManager bir nesne oluşturur. Ancak, bir kaynağı alma girişimi bir MissingManifestResourceException özel durum oluşturur. Özel durumla ilgili bilgi için, bu makalenin devamında Yer alan Handle MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions bölümüne bakın.

Aşağıdaki örnek, bir ResourceManager nesnenin nasıl örnek oluşturacaklarını gösterir. ShowTime.exe adlı yürütülebilir dosyanın kaynak kodunu içerir. Ayrıca, tek bir dize kaynağı TimeHeaderiçeren Strings.txt adlı aşağıdaki metin dosyasını içerir:

TimeHeader=The current time is

Kaynak dosyasını oluşturmak ve yürütülebilir dosyaya eklemek için bir toplu iş dosyası kullanabilirsiniz. C# derleyicisini kullanarak yürütülebilir dosya oluşturmak için toplu iş dosyası aşağıdadır:

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

Visual Basic derleyicisi için aşağıdaki toplu iş dosyasını kullanabilirsiniz:

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 ve kültüre özgü kaynaklar

Yerelleştirilmiş bir uygulama, Kaynakları Paketleme ve Dağıtma makalesinde açıklandığı gibi kaynakların dağıtılması gerekir. Derlemeler düzgün yapılandırılırsa, kaynak yöneticisi geçerli iş parçacığının Thread.CurrentUICulture özelliğine göre hangi kaynakların alındığını belirler. (Bu özellik geçerli iş parçacığının kullanıcı arabirimi kültürünü de döndürür.) Örneğin, bir uygulama ana derlemede varsayılan İngilizce dil kaynaklarıyla ve iki uydu derlemesinde Fransızca ve Rusça dil kaynaklarıyla derlenmişse ve Thread.CurrentUICulture özellik fr-FR olarak ayarlanmışsa, kaynak yöneticisi Fransızca kaynaklarını alır.

Özelliğini açıkça veya örtük olarak ayarlayabilirsiniz CurrentUICulture . Bunu ayarlama şekliniz, nesnenin ResourceManager kültüre göre kaynakları nasıl aldırdığını belirler:

  • Özelliği açıkça belirli bir kültüre ayarlarsanız Thread.CurrentUICulture , kaynak yöneticisi her zaman kullanıcının tarayıcısına veya işletim sistemi diline bakılmaksızın bu kültürün kaynaklarını alır. Varsayılan İngilizce dil kaynakları ve İngilizce (Birleşik Devletler), Fransızca (Fransa) ve Rusça (Rusya) için kaynaklar içeren üç uydu derlemesi ile derlenmiş bir uygulama düşünün. CurrentUICulture özellik fr-FR olarak ayarlanırsa, ResourceManager kullanıcının işletim sistemi dili Fransızca olmasa bile nesne her zaman Fransızca (Fransa) kaynaklarını alır. Özelliği açıkça ayarlamadan önce bunun istenen davranış olduğundan emin olun.

    ASP.NET uygulamalarında, sunucudaki ayarın gelen istemci istekleriyle Thread.CurrentUICulture eşleşme olasılığı düşük olduğundan özelliğini açıkça ayarlamanız gerekir. bir ASP.NET uygulaması, özelliği kullanıcının tarayıcı kabul diline açıkça ayarlayabilir Thread.CurrentUICulture .

    Özelliğini açıkça ayarlamak, Thread.CurrentUICulture bu iş parçacığı için geçerli kullanıcı arabirimi kültürünü tanımlar. Bir uygulamadaki diğer iş parçacıklarının geçerli kullanıcı arabirimi kültürünü etkilemez.

  • Statik CultureInfo.DefaultThreadCurrentUICulture özelliğe bu kültürü temsil eden bir CultureInfo nesne atayarak uygulama etki alanındaki tüm iş parçacıklarının ui kültürünü ayarlayabilirsiniz.

  • Geçerli kullanıcı arabirimi kültürünü açıkça ayarlamazsanız ve geçerli uygulama etki alanı için varsayılan bir kültür tanımlamazsanız, CultureInfo.CurrentUICulture özellik Windows GetUserDefaultUILanguage işlevi tarafından örtük olarak ayarlanır. Bu işlev, kullanıcının varsayılan dili ayarlamasını sağlayan Çok Dilde Kullanıcı Arabirimi (MUI) tarafından sağlanır. Kullanıcı arabirimi dili kullanıcı tarafından ayarlanmamışsa, varsayılan olarak işletim sistemi kaynaklarının dili olan sistem tarafından yüklenen dil kullanılır.

Aşağıdaki basit "Merhaba dünya" örneği, geçerli kullanıcı arabirimi kültürünü açıkça ayarlar. Üç kültür için kaynaklar içerir: İngilizce (Birleşik Devletler) veya en-US, Fransızca (Fransa) veya fr-FR ve Rusça (Rusya) veya ru-RU. En-US kaynakları, Greetings.txt adlı bir metin dosyasında bulunur:

HelloString=Hello world!

fr-FR kaynakları Greetings.fr-FR.txt adlı bir metin dosyasında bulunur:

HelloString=Salut tout le monde!

ru-RU kaynakları Greetings.ru-RU.txt adlı bir metin dosyasında bulunur:

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

Örneğin kaynak kodu (Visual Basic sürümü için Example.vb veya C# sürümü için Example.cs):

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.
'       Всем привет!

Bu örneği derlemek için aşağıdaki komutları içeren bir toplu iş (.bat) dosyası oluşturun ve komut isteminden çalıştırın. C# kullanıyorsanız yerine ve Example.cs yerine Example.vbbelirtin cscvbc.

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

Kaynakları alma

Belirli bir kaynağa erişmek için ve GetString(String) yöntemlerini çağırırsınızGetObject(String). Dize olmayan kaynakları bayt dizisi olarak almak için yöntemini de çağırabilirsiniz GetStream(String) . Varsayılan olarak, yerelleştirilmiş kaynakları olan bir uygulamada, bu yöntemler çağrıyı yapan iş parçacığının geçerli ui kültürü tarafından belirlenen kültürün kaynağını döndürür. bir iş parçacığının geçerli kullanıcı arabirimi kültürünün nasıl tanımlandığı hakkında daha fazla bilgi için resourcemanager ve kültüre özgü kaynaklar başlıklı önceki bölüme bakın. Kaynak yöneticisi geçerli iş parçacığının kullanıcı arabirimi kültürünün kaynağını bulamazsa, belirtilen kaynağı almak için bir geri dönüş işlemi kullanır. Kaynak yöneticisi herhangi bir yerelleştirilmiş kaynak bulamazsa, varsayılan kültürün kaynaklarını kullanır. Kaynak geri dönüş kuralları hakkında daha fazla bilgi için Kaynakları Paketleme ve Dağıtma makalesinin "Kaynak Geri Dönüş İşlemi" bölümüne bakın.

Not

Sınıf oluşturucusunda ResourceManager belirtilen .resources dosyası bulunamazsa, kaynak alma girişimi bir MissingManifestResourceException veya MissingSatelliteAssemblyException özel durumu oluşturur. Özel durumla ilgili bilgi için, bu makalenin devamında Yer alan Handle MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions bölümüne bakın.

Aşağıdaki örnek, kültüre özgü kaynakları almak için yöntemini kullanır GetString . İngilizce (en), Fransızca (Fransa) (fr-FR) ve Rusça (Rusya) (ru-RU) kültürleri için .txt dosyalardan derlenen kaynaklardan oluşur. Örnek, geçerli kültürü ve geçerli kullanıcı arabirimi kültürünü İngilizce (Birleşik Devletler), Fransızca (Fransa), Rusça (Rusya) ve İsveççe (İsveç) olarak değiştirir. Ardından yerelleştirilmiş dizeyi almak için yöntemini çağırır GetString ve bu dize geçerli gün ve ay ile birlikte görüntülenir. Çıktının, geçerli kullanıcı arabirimi kültürünün İsveççe (İsveç) olması dışında uygun yerelleştirilmiş dizeyi görüntülediğine dikkat edin. İsveç dili kaynakları kullanılamadığından, uygulama bunun yerine varsayılan kültürün (İngilizce) kaynaklarını kullanır.

Örnek, aşağıdaki tabloda listelenen metin tabanlı kaynak dosyalarını gerektirir. Her birinin adlı DateStarttek bir dize kaynağı vardır.

Kültür Dosya adı Kaynak adı Kaynak değeri
en-US DateStrings.txt DateStart Bugün
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

Örnek için kaynak kodu aşağıda verilmiştir (Visual Basic sürümü için ShowDate.vb veya kodun C# sürümü için ShowDate.cs).

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.

Bu örneği derlemek için aşağıdaki komutları içeren bir toplu iş dosyası oluşturun ve komut isteminden çalıştırın. C# kullanıyorsanız yerine ve showdate.cs yerine showdate.vbbelirtin cscvbc.

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

Geçerli kullanıcı arabirimi kültürü dışında belirli bir kültürün kaynaklarını almanın iki yolu vardır:

  • Belirli bir kültüre yönelik GetString(String, CultureInfo)bir kaynağı almak için , GetObject(String, CultureInfo)veya GetStream(String, CultureInfo) yöntemini çağırabilirsiniz. Yerelleştirilmiş bir kaynak bulunamazsa, kaynak yöneticisi uygun bir kaynağı bulmak için kaynak geri dönüş işlemini kullanır.
  • Belirli bir kültüre ait kaynakları temsil eden bir ResourceSet nesne elde etmek için yöntemini çağırabilirsinizGetResourceSet. Yöntem çağrısında, kaynak yöneticisinin yerelleştirilmiş kaynakları bulamıyorsa üst kültürler için yoklamaları olup olmadığını veya yalnızca varsayılan kültürün kaynaklarına geri dönüp dönmediğini belirleyebilirsiniz. Ardından yöntemler kullanarak ResourceSet kaynaklara (bu kültür için yerelleştirilmiş) ada göre erişebilir veya kümedeki kaynakları numaralandırabilirsiniz.

MissingManifestResourceException ve MissingSatelliteAssemblyException özel durumlarını işleme

Belirli bir kaynağı almaya çalışırsanız, ancak kaynak yöneticisi bu kaynağı bulamazsa ve varsayılan kültür tanımlanmamışsa veya varsayılan kültürün kaynakları bulunamazsa, kaynak yöneticisi ana derlemedeki kaynakları bulmayı bekliyorsa veya bir uydu derlemesindeki kaynakları bulmayı bekliyorsa bir MissingSatelliteAssemblyException özel durum oluştururMissingManifestResourceException. Bir nesne örneği oluştururken değil veya GetObjectgibi GetString bir kaynak alma yöntemini çağırdığınızda ResourceManager özel durumun oluştuğunu unutmayın.

Özel durum genellikle aşağıdaki koşullar altında oluşturulur:

  • Uygun kaynak dosyası veya uydu derlemesi yok. Kaynak yöneticisi, uygulamanın varsayılan kaynaklarının ana uygulama derlemesine ekli olmasını bekliyorsa, bunlar yoktur. NeutralResourcesLanguageAttribute özniteliği, uygulamanın varsayılan kaynaklarının bir uydu derlemesinde bulunduğunu gösteriyorsa, bu derleme bulunamaz. Uygulamanızı derlerken, kaynakların ana derlemeye eklendiğinden veya gerekli uydu derlemesinin oluşturulduğundan ve uygun şekilde adlandırıldığından emin olun. Adı appName.resources.dll biçiminde olmalı ve kaynaklarını içerdiği kültürün adını taşıyan bir dizinde bulunmalıdır.

  • Uygulamanızın tanımlanmış varsayılan veya nötr bir kültürü yok. NeutralResourcesLanguageAttribute Özniteliğini bir kaynak kod dosyasına veya proje bilgi dosyasına (Visual Basic uygulaması için AssemblyInfo.vb veya C# uygulaması için AssemblyInfo.cs) dosyasına ekleyin.

  • baseName Oluşturucudaki ResourceManager(String, Assembly) parametresi bir .resources dosyasının adını belirtmez. Ad, kaynak dosyasının tam ad alanını içermelidir ancak dosya adı uzantısını içermemelidir. Genellikle, Visual Studio'da oluşturulan kaynak dosyaları ad alanı adlarını içerir, ancak komut isteminde oluşturulan ve derlenen kaynak dosyaları içermez. Aşağıdaki yardımcı programı derleyip çalıştırarak eklenmiş .resources dosyalarının adlarını belirleyebilirsiniz. Bu, bir ana derlemenin veya uydu derlemesinin adını komut satırı parametresi olarak kabul eden bir konsol uygulamasıdır. Kaynak yöneticisinin kaynağı doğru şekilde tanımlayabilmesi için parametre olarak baseName sağlanması gereken dizeleri görüntüler.

    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
    

Uygulamanızın geçerli kültürünü açıkça değiştiriyorsanız, kaynak yöneticisinin özelliğin değilCultureInfo.CurrentCulture, özelliğin CultureInfo.CurrentUICulture değerine göre bir kaynak kümesi aldığını da unutmayın. Genellikle, bir değeri değiştirirseniz, diğerini de değiştirmeniz gerekir.

Kaynak sürümü oluşturma

Bir uygulamanın varsayılan kaynaklarını içeren ana derleme, uygulamanın uydu derlemelerinden ayrı olduğundan, uydu derlemelerini yeniden dağıtmadan ana derlemenizin yeni bir sürümünü serbest bırakabilirsiniz. özniteliğini SatelliteContractVersionAttribute kullanarak mevcut uydu derlemelerini kullanır ve kaynak yöneticisine bunları ana derlemenizin yeni bir sürümüyle yeniden dağıtmamasını söylersiniz.

Uydu derlemeleri için sürüm oluşturma desteği hakkında daha fazla bilgi için Kaynakları Alma makalesine bakın.

<satelliteassemblies> yapılandırma dosyası düğümü

Not

Bu bölüm .NET Framework uygulamalarına özgüdür.

Bir web sitesinden dağıtılan ve çalıştırılan yürütülebilir dosyalar için (HREF .exe dosyaları), ResourceManager nesne web üzerinden uydu derlemeleri için araştırma yapabilir ve bu da uygulamanızın performansını etkileyebilir. Performans sorununu ortadan kaldırmak için bu yoklama işlemini uygulamanızla dağıttığınız uydu derlemeleriyle sınırlayabilirsiniz. Bunu yapmak için uygulamanızın yapılandırma dosyasında bir <satelliteassemblies> düğüm oluşturarak uygulamanız için belirli bir kültür kümesi dağıttığınız ve nesnenin ResourceManager söz konusu düğümde listelenmeyen herhangi bir kültürü yoklamaması gerektiğini belirtirsiniz.

Not

Düğüm oluşturmanın <satelliteassemblies> tercih edilen alternatifi ClickOnce Dağıtım Bildirimi özelliğini kullanmaktır.

Uygulamanızın yapılandırma dosyasında aşağıdakine benzer bir bölüm oluşturun:

<?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>

Bu yapılandırma bilgilerini aşağıdaki gibi düzenleyin:

  • Dağıttığınız her ana derleme için bir veya daha fazla <assembly> düğüm belirtin; burada her düğüm tam derleme adını belirtir. MainAssemblyName yerine ana derlemenizin adını belirtin ve ana derlemenize karşılık gelen , PublicKeyTokenve Culture öznitelik değerlerini belirtinVersion.

    özniteliği için Version derlemenizin sürüm numarasını belirtin. Örneğin, derlemenizin ilk sürümü 1.0.0.0 sürüm numarası olabilir.

    özniteliği için PublicKeyToken , derlemenizi tanımlayıcı bir adla imzalamadıysanız anahtar sözcüğünü null belirtin veya derlemenizi imzaladıysanız ortak anahtar belirtecinizi belirtin.

    özniteliği için Culture ana derlemeyi belirlemek ve sınıfın yalnızca düğümlerde listelenen kültürler için yoklamasına neden olacak ResourceManager anahtar sözcüğünü neutral<culture> belirtin.

    Tam derleme adları hakkında daha fazla bilgi için Derleme Adları makalesine bakın. Tanımlayıcı adlandırılmış derlemeler hakkında daha fazla bilgi için, tanımlayıcı adlandırılmış derlemeler oluşturma ve kullanma makalesine bakın.

  • "fr-FR" gibi belirli bir kültür adına veya "fr" gibi nötr bir kültür adına sahip bir veya daha fazla <culture> düğüm belirtin.

Düğüm altında listelenmeyen <satelliteassemblies> tüm derlemeler için kaynaklar gerekiyorsa, sınıf standart ResourceManager yoklama kurallarını kullanarak kültürleri yoklar.

Windows 8.x uygulamaları

Önemli

Sınıfı Windows 8.x uygulamalarında desteklense ResourceManager de, kullanılmasını önermeyiz. Bu sınıfı yalnızca Windows 8.x uygulamalarıyla kullanılabilecek Taşınabilir Sınıf Kitaplığı projeleri geliştirirken kullanın. Windows 8.x uygulamalarından kaynak almak için bunun yerine Windows.ApplicationModel.Resources.ResourceLoader sınıfını kullanın.

Windows 8.x uygulamaları için ResourceManager sınıfı, paket kaynak dizini (PRI) dosyalarından kaynakları alır. Tek bir PRI dosyası (uygulama paketi PRI dosyası), hem varsayılan kültür hem de yerelleştirilmiş kültürler için kaynakları içerir. XML kaynağı (.resw) biçimindeki bir veya daha fazla kaynak dosyasından PRI dosyası oluşturmak için MakePRI yardımcı programını kullanırsınız. Visual Studio projesine dahil edilen kaynaklar için, Visual Studio PRI dosyasını otomatik olarak oluşturma ve paketleme işlemini işler. Daha sonra uygulamanın veya kitaplığın kaynaklarına erişmek için .NET ResourceManager sınıfını kullanabilirsiniz.

Windows 8.x uygulaması için bir ResourceManager nesnenin örneğini, bir masaüstü uygulaması için yaptığınız gibi oluşturabilirsiniz.

Ardından, yöntemine alınacak kaynağın adını geçirerek belirli bir kültüre ait kaynaklara GetString(String) erişebilirsiniz. Varsayılan olarak, bu yöntem çağrıyı yapan iş parçacığının geçerli ui kültürü tarafından belirlenen kültürün kaynağını döndürür. Ayrıca, kaynağın adını ve kaynağı yöntemine alınacak kültürü temsil eden bir nesneyi geçirerek belirli bir CultureInfo kültüre GetString(String, CultureInfo) ait kaynakları da alabilirsiniz. Geçerli kullanıcı arabirimi kültürünün veya belirtilen kültürün kaynağı bulunamazsa, kaynak yöneticisi uygun bir kaynağı bulmak için bir UI dili geri dönüş listesi kullanır.

Örnekler

Aşağıdaki örnekte, bir ana derlemeden ve uydu derlemesinden dize kaynaklarını almak için açık bir kültürün ve örtük geçerli ui kültürünün nasıl kullanılacağı gösterilmektedir. Daha fazla bilgi için, Uydu Derlemeleri Oluşturma konusunun "Genel Derleme Önbelleğinde Yüklü Olmayan Uydu Derlemeleri için Dizin Konumları" bölümüne bakın.

Bu örneği çalıştırmak için:

  1. Uygulama dizininde, aşağıdaki kaynak dizelerini içeren rmc.txt adlı bir dosya oluşturun:

    day=Friday
    year=2006
    holiday="Cinco de Mayo"
    
  2. Kaynak Dosyası Oluşturucu'yu kullanarak rmc.txt giriş dosyasından aşağıdaki gibi rmc.resources kaynak dosyasını oluşturun:

    resgen rmc.txt
    
  3. Uygulama dizininin bir alt dizinini oluşturun ve "es-MX" olarak adlandırın. Bu, sonraki üç adımda oluşturacağınız uydu derlemesinin kültür adıdır.

  4. es-MX dizininde aşağıdaki kaynak dizelerini içeren rmc.es-MX.txt adlı bir dosya oluşturun:

    day=Viernes
    year=2006
    holiday="Cinco de Mayo"
    
  5. Kaynak Dosyası Oluşturucu'yu kullanarak rmc.es-MX.txt giriş dosyasından rmc.es-MX.resources kaynak dosyasını aşağıdaki gibi oluşturun:

    resgen rmc.es-MX.txt
    
  6. Bu örneğin dosya adının rmc.vb veya rmc.cs olduğunu varsayalım. Aşağıdaki kaynak kodu bir dosyaya kopyalayın. Ardından derleyin ve yürütülebilir derlemeye rmc.resources ana derleme kaynak dosyasını ekleyin. Visual Basic derleyicisini kullanıyorsanız söz dizimi şöyledir:

    vbc rmc.vb /resource:rmc.resources
    

    C# derleyicisi için karşılık gelen söz dizimi:

    csc /resource:rmc.resources rmc.cs
    
  7. Bir uydu derlemesi oluşturmak için Derleme Bağlayıcısı'nı kullanın. Uygulamanın temel adı rmc ise, uydu derleme adı rmc.resources.dll olmalıdır. Uydu derlemesi es-MX dizininde oluşturulmalıdır. Geçerli dizin es-MX ise şu komutu kullanın:

    al /embed:rmc.es-MX.resources /c:es-MX /out:rmc.resources.dll
    
  8. Ekli kaynak dizelerini almak ve görüntülemek için rmc.exe çalıştırın.

    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.