.NET uygulamaları için uydu derlemeleri oluşturma

Kaynak dosyaları yerelleştirilmiş uygulamalarda merkezi bir rol oynar. Bir uygulamanın dizeleri, görüntüleri ve diğer verileri kullanıcının dilinde ve kültüründe görüntülemesine ve kullanıcının diline veya kültürüne yönelik kaynaklar kullanılamıyorsa alternatif veriler sağlamasına olanak tanır. .NET, yerelleştirilmiş kaynakları bulmak ve almak için merkez-uç modeli kullanır. Merkez, yerelleştirilebilir olmayan yürütülebilir kodu ve bağımsız veya varsayılan kültür olarak adlandırılan tek bir kültürün kaynaklarını içeren ana derlemedir. Varsayılan kültür, uygulamanın geri dönüş kültürüdür; kullanılabilir yerelleştirilmiş kaynak olmadığında kullanılır. özniteliğini NeutralResourcesLanguageAttribute kullanarak uygulamanın varsayılan kültürünün kültürünü belirlersiniz. Her uç, tek bir yerelleştirilmiş kültürün kaynaklarını içeren ancak herhangi bir kod içermeyen bir uydu derlemesine bağlanır. Uydu derlemeleri ana derlemenin parçası olmadığından, uygulamanın ana derlemesini değiştirmeden belirli bir kültüre karşılık gelen kaynakları kolayca güncelleştirebilir veya değiştirebilirsiniz.

Not

Bir uygulamanın varsayılan kültürünün kaynakları da bir uydu derlemesinde depolanabilir. Bunu yapmak için özniteliğine NeutralResourcesLanguageAttribute değerini UltimateResourceFallbackLocation.Satelliteatarsınız.

Uydu derleme adı ve konumu

Merkez-uç modeli, kaynakları kolayca bulunabilmeleri ve kullanabilmeleri için belirli konumlara yerleştirmenizi gerektirir. Kaynakları beklendiği gibi derleyip adlandırmıyorsanız veya doğru konumlara yerleştirmezseniz, ortak dil çalışma zamanı bunları bulamaz ve bunun yerine varsayılan kültürün kaynaklarını kullanır. .NET kaynak yöneticisi türüyle ResourceManager temsil edilir ve yerelleştirilmiş kaynaklara otomatik olarak erişmek için kullanılır. Kaynak yöneticisi aşağıdakileri gerektirir:

  • Tek bir uydu derlemesi, belirli bir kültür için tüm kaynakları içermelidir. Başka bir deyişle, birden çok .txt veya .resx dosyasını tek bir ikili .resources dosyasında derlemeniz gerekir.

  • Uygulama dizininde, bu kültürün kaynaklarını depolayan her yerelleştirilmiş kültür için ayrı bir alt dizin olmalıdır. Alt dizin adı, kültür adıyla aynı olmalıdır. Alternatif olarak, uydu derlemelerinizi genel derleme önbelleğinde depolayabilirsiniz. Bu durumda, derlemenin tanımlayıcı adının kültür bilgisi bileşeni kendi kültürünü göstermelidir. Daha fazla bilgi için bkz . Genel Bütünleştirilmiş Kod Önbelleğine uydu derlemelerini yükleme.

    Not

    Uygulamanız alt kültürler için kaynaklar içeriyorsa, her alt kültürü uygulama dizininin altında ayrı bir alt dizine yerleştirin. Alt kültürleri alt dizinlere ana kültürlerinin dizinine yerleştirmeyin.

  • Uydu derlemesi uygulamayla aynı ada sahip olmalı ve ".resources.dll" dosya adı uzantısını kullanmalıdır. Örneğin, bir uygulamanın adı Example.exe ise, her uydu derlemesinin adı Example.resources.dll olmalıdır. Uydu derleme adı, kaynak dosyalarının kültürünü göstermez. Ancak, uydu derlemesi kültürü belirten bir dizinde görünür.

  • Uydu derlemesinin kültürü hakkındaki bilgiler derlemenin meta verilerine eklenmelidir. Kültür adını uydu derlemesinin meta verilerinde depolamak için, kaynakları uydu derlemesine /culture eklemek için Derleme Bağlayıcısı'nı kullanırken seçeneğini belirtirsiniz.

Aşağıdaki çizimde, genel derleme önbelleğine yüklemediğiniz uygulamalar için örnek dizin yapısı ve konum gereksinimleri gösterilmektedir. .txt ve .resources uzantılı öğeler son uygulamayla birlikte gelmez. Bunlar, son uydu kaynak derlemelerini oluşturmak için kullanılan ara kaynak dosyalarıdır. Bu örnekte, .txt dosyalarının yerine .resx dosyalarını kullanabilirsiniz. Daha fazla bilgi için bkz . Kaynakları paketleme ve dağıtma.

Aşağıdaki görüntüde uydu derleme dizini gösterilmektedir:

A satellite assembly directory with localized cultures subdirectories.

Uydu derlemelerini derleme

İkili .resources dosyalarına kaynak içeren metin dosyalarını veya XML (.resx) dosyalarını derlemek için Kaynak Dosya Oluşturucu (resgen.exe) kullanırsınız. Daha sonra .resources dosyalarını uydu derlemelerine derlemek için Derleme Bağlayıcısı'nı (al.exe) kullanırsınız. al.exe, belirttiğiniz .resources dosyalarından bir derleme oluşturur. Uydu derlemeleri yalnızca kaynak içerebilir; yürütülebilir kod içeremezler.

Aşağıdaki al.exe komutu, Alman resources file strings.de.resources dosyasından uygulama Example için bir uydu derlemesi oluşturur.

al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll

Aşağıdaki al.exe komutu, dosya strings.de.resources dosyasından uygulama Example için bir uydu derlemesi de oluşturur. /template seçeneği, uydu derlemesinin üst derlemeden (Example.dll) kültür bilgileri dışında tüm derleme meta verilerini devralmalarına neden olur.

al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll -template:Example.dll

Aşağıdaki tabloda, bu komutlarda kullanılan al.exe seçenekleri daha ayrıntılı olarak açıklanmaktadır:

Seçenek Açıklama
-target:lib Uydu derlemenizin bir kitaplık (.dll) dosyasına derlendiğini belirtir. Bir uydu derlemesi yürütülebilir kod içermediğinden ve uygulamanın ana derlemesi olmadığından, uydu derlemelerini DLL olarak kaydetmeniz gerekir.
-embed:strings.de.resources al.exe derlemeyi derlerken eklenecek kaynak dosyasının adını belirtir. Bir uydu derlemesine birden çok .resources dosyası ekleyebilirsiniz, ancak merkez-uç modelini izliyorsanız, her kültür için bir uydu derlemesi derlemeniz gerekir. Ancak, dizeler ve nesneler için ayrı .resources dosyaları oluşturabilirsiniz.
-culture:de Derlenecek kaynağın kültürünü belirtir. Ortak dil çalışma zamanı, belirtilen bir kültür için kaynakları ararken bu bilgileri kullanır. Bu seçeneği atlarsanız, al.exe kaynağı derlemeye devam eder, ancak kullanıcı istediğinde çalışma zamanı kaynağı bulamaz.
-out:Example.resources.dll Çıkış dosyasının adını belirtir. Adın standart baseName.resources adlandırmasını izlemesi gerekir.uzantısıdır; burada baseName ana derlemenin adıdır ve uzantı geçerli bir dosya adı uzantısıdır (.dll gibi). Çalışma zamanı, çıkış dosyası adına göre bir uydu derlemesinin kültürünü belirleyemiyor; belirtmek için /culture seçeneğini kullanmanız gerekir.
-template:Example.dll Uydu derlemesinin kültür alanı dışında tüm derleme meta verilerini devralacağı bir derleme belirtir. Bu seçenek, uydu derlemelerini yalnızca tanımlayıcı ada sahip bir derleme belirtirseniz etkiler.

al.exe ile kullanılabilen seçeneklerin tam listesi için bkz. Derleme Bağlayıcısı (al.exe).

Not

.NET Framework'i hedefleseniz bile uydu derlemelerini derlemek için .NET Core MSBuild görevini kullanmak istediğiniz zamanlar olabilir. Örneğin, farklı derlemelerdeki derlemeleri karşılaştırmak için C# derleyici belirleyici seçeneğini kullanmak isteyebilirsiniz. Bu durumda, .csproj dosyasında GenerateSatelliteAssembliesForCore true olarak ayarlayarak Al.exe (Assembly Linker) yerine csc.exe kullanarak uydu derlemeleri oluşturun.

<Project>
    <PropertyGroup>
        <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
    </PropertyGroup>
</Project>

.NET Core MSBuild görevi, varsayılan olarak uydu derlemeleri oluşturmak için al.exe yerine csc.exe kullanır. Daha fazla bilgi için bkz . "Çekirdek" uydu derlemesi oluşturmayı seçmeyi kolaylaştırma.

Uydu derlemeleri örneği

Aşağıda, yerelleştirilmiş selamlama içeren bir ileti kutusu görüntüleyen basit bir "Merhaba dünya" örneği verilmiştir. Örnek, İngilizce (Birleşik Devletler), Fransızca (Fransa) ve Rusça (Rusya) kültürleri için kaynakları içerir ve geri dönüş kültürü İngilizcedir. Örneği oluşturmak için aşağıdakileri yapın:

  1. Varsayılan kültürün kaynağını içerecek Greeting.resx veya Greeting.txt adlı bir kaynak dosyası oluşturun. Değeri "Hello world!" olan tek HelloString bir dizeyi bu dosyada depolayın.

  2. İngilizcenin (en) uygulamanın varsayılan kültürü olduğunu belirtmek için uygulamanın AssemblyInfo dosyasına veya uygulamanın ana derlemesinde derlenecek ana kaynak kod dosyasına aşağıdaki System.Resources.NeutralResourcesLanguageAttribute özniteliği ekleyin.

    [assembly: NeutralResourcesLanguage("en")]
    
    <Assembly: NeutralResourcesLanguage("en")>
    
  3. Uygulamaya aşağıdaki gibi ek kültürler (en-US, fr-FRve ru-RU) için destek ekleyin:

    • veya İngilizce (Birleşik Devletler) kültürünü desteklemek en-US için Greeting.en-US.resx veya Greeting.en-US.txt adlı bir kaynak dosyası oluşturun ve içinde değeri "Merhaba dünya!" olan tek HelloString bir dize depolayın.

    • veya Fransızca (Fransa) kültürünü desteklemek fr-FR için Greeting.fr-FR.resx veya Greeting.fr-FR.txt adlı bir kaynak dosyası oluşturun ve içinde değeri "Salut tout le monde!" olan tek bir dize HelloString depolayın.

    • veya Rusça (Rusya) kültürünü desteklemek ru-RU için Greeting.ru-RU.resx veya Greeting.ru-RU.txt adlı bir kaynak dosyası oluşturun ve içinde değeri "Всем привет!" olan adlı HelloString tek bir dize depolayın.

  4. Her metin veya XML kaynak dosyasını ikili bir .resources dosyasına derlemek için resgen.exe kullanın. Çıktı, .resx veya .txt dosyalarıyla aynı kök dosya adına ancak .resources uzantısına sahip bir dosya kümesidir. Örneği Visual Studio ile oluşturursanız, derleme işlemi otomatik olarak işlenir. Visual Studio kullanmıyorsanız, .resx dosyalarını .resources dosyalarında derlemek için aşağıdaki komutları çalıştırın:

    resgen Greeting.resx
    resgen Greeting.en-us.resx
    resgen Greeting.fr-FR.resx
    resgen Greeting.ru-RU.resx
    

    Kaynaklarınız XML dosyaları yerine metin dosyalarındaysa , .resx uzantısını .txt ile değiştirin.

  5. Uygulamanın ana derlemesinde varsayılan kültür kaynaklarıyla birlikte aşağıdaki kaynak kodunu derleyin:

    Önemli

    Örneği oluşturmak için Visual Studio yerine komut satırını kullanıyorsanız, sınıf oluşturucusunun ResourceManager çağrısını aşağıdaki şekilde değiştirmeniz gerekir: ResourceManager rm = new ResourceManager("Greeting", typeof(Example).Assembly);

    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    using System.Threading;
    using System.Windows.Forms;
    
    class Example
    {
       static void Main()
       {
          // Create array of supported cultures
          string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"};
          Random rnd = new Random();
          int cultureNdx = rnd.Next(0, cultures.Length);
          CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
    
          try {
             CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
             Thread.CurrentThread.CurrentCulture = newCulture;
             Thread.CurrentThread.CurrentUICulture = newCulture;
             ResourceManager rm = new ResourceManager("Example.Greeting",
                                                      typeof(Example).Assembly);
             string greeting = String.Format("The current culture is {0}.\n{1}",
                                             Thread.CurrentThread.CurrentUICulture.Name,
                                             rm.GetString("HelloString"));
    
             MessageBox.Show(greeting);
          }
          catch (CultureNotFoundException e) {
             Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
          }
          finally {
             Thread.CurrentThread.CurrentCulture = originalCulture;
             Thread.CurrentThread.CurrentUICulture = originalCulture;
          }
       }
    }
    
    Imports System.Globalization
    Imports System.Resources
    Imports System.Threading
    
    Module Module1
    
        Sub Main()
            ' Create array of supported cultures
            Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU"}
            Dim rnd As New Random()
            Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
            Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
    
            Try
                Dim newCulture As New CultureInfo(cultures(cultureNdx))
                Thread.CurrentThread.CurrentCulture = newCulture
                Thread.CurrentThread.CurrentUICulture = newCulture
                Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                       Thread.CurrentThread.CurrentUICulture.Name,
                                                       vbCrLf, My.Resources.Greetings.HelloString)
    
                MsgBox(greeting)
            Catch e As CultureNotFoundException
                Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
            Finally
                Thread.CurrentThread.CurrentCulture = originalCulture
                Thread.CurrentThread.CurrentUICulture = originalCulture
            End Try
        End Sub
    End Module
    

    Uygulamanın adı Örnek ise ve komut satırından derleniyorsanız, C# derleyicisinin komutu şu şekildedir:

    csc Example.cs -res:Greeting.resources
    

    Karşılık gelen Visual Basic derleyici komutu:

    vbc Example.vb -res:Greeting.resources
    
  6. Uygulama tarafından desteklenen her yerelleştirilmiş kültür için ana uygulama dizininde bir alt dizin oluşturun. En-US, fr-FR ve ru-RU alt dizini oluşturmanız gerekir. Visual Studio bu alt dizinleri derleme işleminin bir parçası olarak otomatik olarak oluşturur.

  7. Kültüre özgü .resources dosyalarını uydu derlemelerine ekleyin ve uygun dizine kaydedin. Her .resources dosyası için bunu yapmak için komut şöyledir:

    al -target:lib -embed:Greeting.culture.resources -culture:culture -out:culture\Example.resources.dll
    

    burada kültür , uydu derlemesinin kaynaklarını içeren kültürün adıdır. Visual Studio bu işlemi otomatik olarak işler.

Ardından örneği çalıştırabilirsiniz. Desteklenen kültürlerden birini geçerli kültür haline getirir ve yerelleştirilmiş bir karşılama görüntüler.

Uydu derlemelerini Genel Bütünleştirilmiş Kod Önbelleğine yükleme

Derlemeleri yerel uygulama alt dizinine yüklemek yerine, bunları genel derleme önbelleğine yükleyebilirsiniz. Bu, özellikle birden çok uygulama tarafından kullanılan sınıf kitaplıklarınız ve sınıf kitaplığı kaynak derlemeleriniz varsa kullanışlıdır.

Derlemeleri genel derleme önbelleğine yüklemek için tanımlayıcı adlara sahip olmaları gerekir. Tanımlayıcı adlandırılmış derlemeler geçerli bir ortak/özel anahtar çifti ile imzalanır. Bunlar, çalışma zamanının bağlama isteğini karşılamak için hangi derlemenin kullanılacağını belirlemek için kullandığı sürüm bilgilerini içerir. Tanımlayıcı adlar ve sürüm oluşturma hakkında daha fazla bilgi için bkz . Derleme sürümü oluşturma. Tanımlayıcı adlar hakkında daha fazla bilgi için bkz . Tanımlayıcı adlandırılmış derlemeler.

Bir uygulama geliştirirken, son genel/özel anahtar çiftine erişme olasılığınız düşüktür. Genel derleme önbelleğine bir uydu derlemesi yüklemek ve beklendiği gibi çalıştığından emin olmak için gecikmeli imzalama adlı bir teknik kullanabilirsiniz. Derlemeyi imzalamayı geciktirdiğinizde, derleme zamanında dosyada tanımlayıcı ad imzası için yer ayırırsınız. Gerçek imzalama, son genel/özel anahtar çiftinin kullanılabilir olduğu zamana kadar gecikir. Gecikmeli imzalama hakkında daha fazla bilgi için bkz . Derlemeyi imzalamayı geciktirme.

Ortak anahtarı alma

Derlemeyi imzalamayı geciktirmek için ortak anahtara erişiminiz olmalıdır. Şirketinizdeki nihai imzalamayı yapacak kuruluştan gerçek ortak anahtarı alabilir veya Tanımlayıcı Ad aracını (sn.exe) kullanarak bir ortak anahtar oluşturabilirsiniz.

Aşağıdaki Sn.exe komutu bir test ortak/özel anahtar çifti oluşturur. –k seçeneği, Sn.exe yeni bir anahtar çifti oluşturup TestKeyPair.snk adlı bir dosyaya kaydetmesi gerektiğini belirtir.

sn –k TestKeyPair.snk

Ortak anahtarı, test anahtarı çiftini içeren dosyadan ayıklayabilirsiniz. Aşağıdaki komut, TestKeyPair.snk dosyasından ortak anahtarı ayıklar ve PublicKey.snk dosyasında kaydeder:

sn –p TestKeyPair.snk PublicKey.snk

Derlemeyi imzalamayı geciktirme

Ortak anahtarı aldıktan veya oluşturduktan sonra derlemeyi derlemek ve gecikmeli imzalamayı belirtmek için Derleme Bağlayıcısı'nı (al.exe) kullanırsınız.

Aşağıdaki al.exe komutu strings.ja.resources dosyasından StringLibrary uygulaması için tanımlayıcı adlı bir uydu derlemesi oluşturur:

al -target:lib -embed:strings.ja.resources -culture:ja -out:StringLibrary.resources.dll -delay+ -keyfile:PublicKey.snk

-delay+ seçeneği, Derleme Bağlayıcısı'nın derlemeyi imzalamayı geciktirmesi gerektiğini belirtir. -keyfile seçeneği, derlemeyi imzalamayı geciktirmek için kullanılacak ortak anahtarı içeren anahtar dosyasının adını belirtir.

Derlemeyi Yeniden İmzalama

Uygulamanızı dağıtmadan önce gecikmeli imzalı uydu derlemesini gerçek anahtar çiftiyle yeniden imzalamanız gerekir. Bunu Sn.exe kullanarak yapabilirsiniz.

Aşağıdaki Sn.exe komutu, StringLibrary.resources.dll RealKeyPair.snk dosyasında depolanan anahtar çiftiyle imzalar. –R seçeneği, önceden imzalanan veya gecikmeli imzalı derlemenin yeniden imzalanması gerektiğini belirtir.

sn –R StringLibrary.resources.dll RealKeyPair.snk

Genel Bütünleştirilmiş Kod Önbelleğine uydu derlemesi yükleme

Çalışma zamanı kaynak geri dönüş işlemindeki kaynakları ararken, önce genel derleme önbelleğine bakar. (Daha fazla bilgi için Kaynakları paketleyip dağıtın.) Bir uydu derlemesi tanımlayıcı bir adla imzalanır imzalanmaz, Genel Derleme Önbelleği aracı (gacutil.exe) kullanılarak genel derleme önbelleğine yüklenebilir.

Aşağıdaki Gacutil.exe komutu genel derleme önbelleğine StringLibrary.resources.dll* yükler:

gacutil -i:StringLibrary.resources.dll

/i seçeneği, Gacutil.exe belirtilen derlemeyi genel derleme önbelleğine yüklemesi gerektiğini belirtir. Uydu derlemesi önbelleğe yüklendikten sonra içerdiği kaynaklar, uydu derlemesini kullanmak üzere tasarlanmış tüm uygulamalar tarafından kullanılabilir hale gelir.

Genel Bütünleştirilmiş Kod Önbelleğindeki Kaynaklar: Örnek

Aşağıdaki örnek, bir kaynak dosyasından yerelleştirilmiş bir karşılama ayıklamak ve döndürmek için .NET sınıf kitaplığındaki bir yöntemi kullanır. Kitaplık ve kaynakları genel derleme önbelleğine kaydedilir. Örnek, İngilizce (Birleşik Devletler), Fransızca (Fransa), Rusça (Rusya) ve İngilizce kültürleri için kaynakları içerir. İngilizce varsayılan kültürdür; kaynakları ana derlemede depolanır. Örnek başlangıçta kitaplığı ve uydu derlemelerini bir ortak anahtarla geciktirerek imzalar, sonra bunları ortak/özel anahtar çiftiyle yeniden imzalar. Örneği oluşturmak için aşağıdakileri yapın:

  1. Visual Studio kullanmıyorsanız, ResKey.snk adlı bir ortak/özel anahtar çifti oluşturmak için aşağıdaki Tanımlayıcı Ad Aracı (Sn.exe) komutunu kullanın:

    sn –k ResKey.snk
    

    Visual Studio kullanıyorsanız anahtar dosyasını oluşturmak için proje Özellikleri iletişim kutusunun İmzalama sekmesini kullanın.

  2. PublicKey.snk adlı bir ortak anahtar dosyası oluşturmak için aşağıdaki Tanımlayıcı Ad Aracı (Sn.exe) komutunu kullanın:

    sn –p ResKey.snk PublicKey.snk
    
  3. Varsayılan kültürün kaynağını içerecek Strings.resx adlı bir kaynak dosyası oluşturun. Değeri "Nasıl yapılır?" olan tek Greeting bir dizeyi bu dosyada depolayın.

  4. "en" öğesinin uygulamanın varsayılan kültürü olduğunu belirtmek için uygulamanın AssemblyInfo dosyasına veya uygulamanın ana derlemesinde derlenecek ana kaynak kod dosyasına aşağıdaki System.Resources.NeutralResourcesLanguageAttribute özniteliği ekleyin:

    [assembly:NeutralResourcesLanguageAttribute("en")]
    
    <Assembly: NeutralResourcesLanguageAttribute("en")>
    
  5. Uygulamaya aşağıdaki gibi ek kültürler (en-US, fr-FR ve ru-RU kültürleri) için destek ekleyin:

    • "En-US" veya İngilizce (Birleşik Devletler) kültürünü desteklemek için Strings.en-US.resx veya Strings.en-US.txt adlı bir kaynak dosyası oluşturun ve içinde değeri "Hello!" olan tek Greeting bir dize depolayın.

    • "fr-FR" veya Fransızca (Fransa) kültürünü desteklemek için Strings.fr-FR.resx veya Strings.fr-FR.txt adlı bir kaynak dosyası oluşturun ve içinde değeri "Bon jour!" olan tek Greeting bir dize depolayın.

    • "ru-RU" veya Rusça (Rusya) kültürünü desteklemek için Strings.ru-RU.resx veya Strings.ru-RU.txt adlı bir kaynak dosyası oluşturun ve içinde değeri "Привет!" olan tek Greeting bir dize depolayın.

  6. Her metin veya XML kaynak dosyasını ikili bir .resources dosyasına derlemek için resgen.exe kullanın. Çıktı, .resx veya .txt dosyalarıyla aynı kök dosya adına ancak .resources uzantısına sahip bir dosya kümesidir. Örneği Visual Studio ile oluşturursanız, derleme işlemi otomatik olarak işlenir. Visual Studio kullanmıyorsanız, .resx dosyalarını .resources dosyalarına derlemek için aşağıdaki komutu çalıştırın:

    resgen filename
    

    Burada dosya adı, .resx veya metin dosyasının isteğe bağlı yolu, dosya adı ve uzantısıdır.

  7. Varsayılan kültür kaynaklarıyla birlikte StringLibrary.vb veya StringLibrary.cs için aşağıdaki kaynak kodunu StringLibrary.dll adlı gecikmeli imzalı kitaplık derlemesinde derleyin:

    Önemli

    Örneği oluşturmak için Visual Studio yerine komut satırını kullanıyorsanız, sınıf oluşturucusunun ResourceManagerResourceManager rm = new ResourceManager("Strings",typeof(Example).Assembly);çağrısında değişiklik yapmalısınız.

    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    using System.Threading;
    
    [assembly:NeutralResourcesLanguageAttribute("en")]
    
    public class StringLibrary
    {
       public string GetGreeting()
       {
          ResourceManager rm = new ResourceManager("Strings",
                               Assembly.GetAssembly(typeof(StringLibrary)));
          string greeting = rm.GetString("Greeting");
          return greeting;
       }
    }
    
    Imports System.Globalization
    Imports System.Reflection
    Imports System.Resources
    Imports System.Threading
    
    <Assembly: NeutralResourcesLanguageAttribute("en")>
    
    Public Class StringLibrary
        Public Function GetGreeting() As String
            Dim rm As New ResourceManager("Strings", _
                                          Assembly.GetAssembly(GetType(StringLibrary)))
            Dim greeting As String = rm.GetString("Greeting")
            Return greeting
        End Function
    End Class
    

    C# derleyicisinin komutu şu şekildedir:

    csc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.cs
    

    Karşılık gelen Visual Basic derleyici komutu:

    vbc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.vb
    
  8. Uygulama tarafından desteklenen her yerelleştirilmiş kültür için ana uygulama dizininde bir alt dizin oluşturun. En-US, fr-FR ve ru-RU alt dizini oluşturmanız gerekir. Visual Studio bu alt dizinleri derleme işleminin bir parçası olarak otomatik olarak oluşturur. Tüm uydu derlemeleri aynı dosya adına sahip olduğundan, alt dizinler ortak/özel anahtar çifti ile imzalanana kadar kültüre özgü tek tek uydu derlemelerini depolamak için kullanılır.

  9. Kültüre özgü .resources dosyalarını gecikmeli imzalı uydu derlemelerine ekleyin ve uygun dizine kaydedin. Her .resources dosyası için bunu yapmak için komut şöyledir:

    al -target:lib -embed:Strings.culture.resources -culture:culture -out:culture\StringLibrary.resources.dll -delay+ -keyfile:publickey.snk
    

    burada kültür, bir kültürün adıdır. Bu örnekte kültür adları en-US, fr-FR ve ru-RU şeklindedir.

  10. Aşağıdaki gibi Tanımlayıcı Ad aracını (sn.exe) kullanarak StringLibrary.dll yeniden imzalayın:

    sn –R StringLibrary.dll RealKeyPair.snk
    
  11. Tek tek uydu derlemelerini yeniden imzalayın. Bunu yapmak için, her uydu derlemesi için aşağıdaki gibi Tanımlayıcı Ad aracını (sn.exe) kullanın:

    sn –R StringLibrary.resources.dll RealKeyPair.snk
    
  12. Aşağıdaki komutu kullanarak StringLibrary.dll ve uydu derlemelerinin her birini genel derleme önbelleğine kaydedin:

    gacutil -i filename
    

    burada dosya adı , kaydedilecek dosyanın adıdır.

  13. Visual Studio kullanıyorsanız adlı yeni bir Konsol Uygulaması projesi oluşturun, StringLibrary.dll ve aşağıdaki kaynak koduna bir başvuru ekleyin ve derleyinExample.

    using System;
    using System.Globalization;
    using System.Threading;
    
    public class Example
    {
       public static void Main()
       {
          string[] cultureNames = { "en-GB", "en-US", "fr-FR", "ru-RU" };
          Random rnd = new Random();
          string cultureName = cultureNames[rnd.Next(0, cultureNames.Length)];
          Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
          Console.WriteLine("The current UI culture is {0}",
                            Thread.CurrentThread.CurrentUICulture.Name);
          StringLibrary strLib = new StringLibrary();
          string greeting = strLib.GetGreeting();
          Console.WriteLine(greeting);
       }
    }
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example
        Public Sub Main()
            Dim cultureNames() As String = {"en-GB", "en-US", "fr-FR", "ru-RU"}
            Dim rnd As New Random()
            Dim cultureName As String = cultureNames(rnd.Next(0, cultureNames.Length))
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
            Console.WriteLine("The current UI culture is {0}",
                              Thread.CurrentThread.CurrentUICulture.Name)
            Dim strLib As New StringLibrary()
            Dim greeting As String = strLib.GetGreeting()
            Console.WriteLine(greeting)
        End Sub
    End Module
    

    Komut satırından derlemek için C# derleyicisi için aşağıdaki komutu kullanın:

    csc Example.cs -r:StringLibrary.dll
    

    Visual Basic derleyicisinin komut satırı:

    vbc Example.vb -r:StringLibrary.dll
    
  14. Example.exe çalıştırın.

Ayrıca bkz.