Aracılığıyla paylaş


System.Resources.ResourceManager sınıfı

Uyarı

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.

Bu ResourceManager sınıfı, 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 bir CreateFileBasedResourceManager nesnesini kullanarak bir derlemeye katıştırılmayan bir .resources dosyasından kaynakları doğrudan alabilirsiniz.

Dikkat

ASP.NET uygulamasında bağımsız .resources dosyalarının kullanılması, kaynaklar ReleaseAllResources yöntemi tarafından açıkça serbest bırakılıncaya kadar kilitli kaldığından, XCOPY dağıtımını bozar. 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ı, eğer kültüre özgü kaynaklar bulunamazsa varsayılan kültürün kaynaklarını içerir. Örneğin, bir uygulamanın varsayılan kültürü İngilizce (tr) ise, İngilizce (ABD) (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.dlluzantı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 metin veya XML dosyalarını Kaynak Dosya Oluşturucu (Resgen.exe) ile derlersiniz. 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ının, 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ız (Belçika) kültürü için MyResources.fr-BE.resources gibi adları 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 hiçbir mekanizma aracılığıyla uygulamanız tarafından erişilemez.)

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 nesnesini örnekle

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 ResourceManager nesneyi belirli bir .resources dosyasıyla ve uydu derlemelerindeki ilişkili yerelleştirilmiş .resources dosyalarıyla sıkı bir ş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 nesnesi üzerinden alınan bilgilere dayanarak 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ımcısı 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. İstisna ile başa çıkma hakkında bilgi için, bu makalenin ilerleyen bölümlerinde Handle MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions başlıklı bölüme bakın.

Aşağıdaki örnek, bir ResourceManager nesnesinin nasıl örnek oluşturulacağını gösterir. ShowTime.exeadlı 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($"{timeString} {DateTime.Now:T}");
    }
}
// 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ınacağı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 derlemedeki varsayılan İngilizce kaynaklarıyla ve iki uydu derlemesinde Fransızca ve Rusça dil kaynaklarıyla derlenmişse ve Thread.CurrentUICulture özelliği fr-FRolarak 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 edindiğini 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 (ABD), Fransızca (Fransa) ve Rusça (Rusya) için kaynaklar içeren üç uydu derlemesi ile derlenmiş bir uygulama düşünün. CurrentUICulture özelliği fr-FRolarak 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. Uygulamadaki diğer iş parçacıklarının mevcut kullanıcı arabirimi kültürünü etkilemez.

  • Statik CultureInfo özelliğe bu kültürü temsil eden bir CultureInfo.DefaultThreadCurrentUICulture 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 Dilli 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 (ABD) veya en-US, Fransızca (Fransa) veya fr-FRve Rusça (Rusya) veya ru-RU. en-US kaynakları, Greetings.txtadlı bir metin dosyasında bulunur:

HelloString=Hello world!

fr-FR kaynakları, Greetings.fr-FR.txtadlı bir metin dosyasında bulunur:

HelloString=Salut tout le monde!

ru-RU kaynakları, Greetings.ru-RU.txtadlı 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 {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 batch (.bat) dosyası oluşturun ve komut isteminden çalıştırın. C# kullanıyorsanız, csc yerine vbc ve Example.cs yerine Example.vb belirtin.

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 GetObject(String) ve GetString(String) yöntemlerini çağırırsınız. Dize olmayan kaynakları bayt dizisi olarak almak için yöntemini de çağırabilirsiniz GetStream(String) . Varsayılan olarak, yerelleştirilmiş kaynaklara sahip 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üre ait kaynağı 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ü için kaynağı bulamazsa, belirtilen kaynağı elde etmek amacıyla bir yedekleme süreci 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.

Uyarı

Sınıf oluşturucusunda ResourceManager belirtilen .resources dosyası bulunamazsa, kaynak alma girişimi bir MissingManifestResourceException veya MissingSatelliteAssemblyException özel durumu oluşturur. İstisna ile başa çıkma hakkında bilgi için, bu makalenin ilerleyen bölümlerinde Handle MissingManifestResourceException and MissingSatelliteAssemblyException Exceptions başlıklı bölüme bakın.

Aşağıdaki örnek, kültüre özgü kaynakları almak için GetString yöntemini kullanır. İ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 (ABD), Fransızca (Fransa), Rusça (Rusya) ve İsveççe (İsveç) olarak değiştirir. Ardından yerelleştirilmiş dizeyi almak için GetString yöntemini çağırır 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 DateStartadlı tek 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 Bugün, bu
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: {CultureInfo.CurrentUICulture.Name}");
            string dateString = rm.GetString("DateStart");
            Console.WriteLine($"{dateString} {DateTime.Now:M}.\n");
        }
    }
}
// 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, csc yerine vbc ve showdate.cs yerine showdate.vb belirtin.

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 GetResourceSet nesne elde etmek için yöntemini çağırabilirsinizResourceSet. Yöntem çağrısında, kaynak yöneticisinin, yerelleştirilmiş kaynakları bulamıyorsa, üst kültürlerde yoklamalar yapıp yapmayacağını veya yalnızca varsayılan kültürün kaynaklarına geri dönüp dönmeyeceğini belirleyebilirsiniz. Daha sonra ResourceSet yöntemlerini kullanarak kaynaklara (bu kültüre göre yerelleştirilmiş) ada göre erişebilir veya kümedeki kaynakları numaralandırabilirsiniz.

MissingManifestResourceException ve MissingSatelliteAssemblyException hata durumlarını yönetme

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 MissingManifestResourceException özel durum oluştururMissingSatelliteAssemblyException. GetString veya GetObject gibi bir kaynak alma yöntemini çağırdığınızda ve bir ResourceManager nesnesi örneklediğinizde değil, özel durumun meydana geldiğini 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.dllbiç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($"{filename} does not exist.");
             return;
          }   
          
          // Try to load the assembly.
          Assembly assem = Assembly.LoadFrom(filename);
          Console.WriteLine($"File: {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: {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 CultureInfo.CurrentUICulture özelliğine değil, CultureInfo.CurrentCulture özelliğine 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ü

Uyarı

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.

Uyarı

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 , Versionve PublicKeyToken öznitelik değerlerini belirtinCulture.

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

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

    Culture özniteliği için neutral anahtar sözcüğünü belirtin, böylece ResourceManager sınıfı, yalnızca <culture> düğümlerinde listelenen kültürler için ana derlemeyi yoklayacaktır.

    Tam nitelikli 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 sahip bir veya daha fazla <culture> düğüm veya "fr" gibi nötr bir kültür adı belirtin.

<satelliteassemblies> düğümünün altında listelenmeyen herhangi bir derleme için kaynaklar gerekiyorsa, ResourceManager sınıfı standart yoklama kurallarını kullanarak kültürleri araştırır.

Windows 8.x uygulamaları

Önemli

ResourceManager sınıfı Windows 8.x uygulamalarında desteklense 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, alınacak kaynağın adını GetString(String) yöntemine geçirerek belirli bir kültürün kaynaklarına 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. Belirli bir kültüre ait kaynakları almak için, kaynağın adını ve bu kaynağın alınacağı kültürü temsil eden bir nesneyi CultureInfo yöntemine geçirerek de 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 örnek, ana derleme ve uydu derlemesinden dize kaynaklarını elde etmek için açık bir kültürü ve örtük olan geçerli UI kültürünü nasıl kullanabileceğinizi göstermektedir. 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 Dosya Oluşturucu'yu kullanarak, rmc.es-MX.txt giriş dosyasındanes-MX.resources kaynak dosyasını oluşturmak için rmc'yi şu şekilde 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. "Assembly Linker'ı kullanarak bir uydu derlemesi oluşturun." Uygulamanın temel adı rmc ise, uydu derleme adı rmc.resources.dllolmalı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.