.NET uygulamaları için kaynak dosyaları oluşturma

Uygulamanızda kolayca kullanılabilir hale getirmek için dizeler, görüntüler ve nesneler verileri gibi kaynaklarını ekleyebilirsiniz. .NET Framework, kaynak dosyaları oluşturmak için beş yol sunar:

  • Dize kaynaklarını içeren bir metin dosyası oluşturun. Metin dosyasını ikili kaynak (.resources) dosyasına dönüştürmek için Kaynak Dosya Oluşturucu(resgen.exe) kullanabilirsiniz. Daha sonra dil derleyicisi kullanarak ikili kaynak dosyasını bir uygulama yürütülebilir dosyasına veya uygulama kitaplığına ekleyebilir veya Derleme Bağlayıcısı (Al.exe) kullanarak bir uydu derlemesine ekleyebilirsiniz. Daha fazla bilgi için Metin dosyalarındaki kaynaklar bölümüne bakın.

  • Dize, resim veya nesne verilerini içeren bir XML kaynak (.resx) dosyası oluşturun. .resx dosyasını ikili kaynak (.resources) dosyasına dönüştürmek için Kaynak Dosya Oluşturucu (resgen.exe) kullanabilirsiniz. Daha sonra dil derleyicisi kullanarak ikili kaynak dosyasını bir uygulama yürütülebilir dosyasına veya uygulama kitaplığına ekleyebilir veya Derleme Bağlayıcısı (Al.exe) kullanarak bir uydu derlemesine ekleyebilirsiniz. Daha fazla bilgi için .resx Dosyalarındaki Kaynaklar bölümüne bakın.

  • System.Resources ad alanındaki türleri kullanarak program aracılığıyla bir XML kaynak (.resx) dosyası oluşturun . Bir .resx dosyası oluşturabilir, kaynaklarını numaralandırabilir veya belirli kaynaklarını ada göre alabilirsiniz. Daha fazla bilgi için bkz . Program Aracılığıyla .resx Dosyalarıyla Çalışma.

  • Program aracılığıyla ikili bir kaynak (.resources) dosyası oluşturun. Daha sonra dil derleyicisi kullanarak dosyayı bir uygulama yürütülebilir dosyasına veya uygulama kitaplığına ekleyebilir veya Derleme Bağlayıcısı (Al.exe) kullanarak bir uydu derlemesine ekleyebilirsiniz. Daha fazla bilgi için .resources Dosyalarındaki Kaynaklar bölümüne bakın.

  • Visual Studio'yu kullanarak bir kaynak dosyası oluşturun ve bunu projenize ekleyin. Visual Studio, kaynakları eklemenizi, silmenizi ve değiştirmenizi sağlayan bir kaynak düzenleyicisi sağlar. Derleme sırasında, kaynak dosyası otomatik olarak ikili bir .resources dosyasına dönüştürülür ve bir uygulama derlemesine veya uydu derlemesine gömülür. Daha fazla bilgi için Visual Studio'daki Kaynak dosyaları bölümüne bakın.

Metin dosyalarındaki kaynaklar

Yalnızca dize kaynaklarını depolamak için metin (.txt veya .restext) dosyalarını kullanabilirsiniz. Dize olmayan kaynaklar için .resx dosyalarını kullanın veya bunları program aracılığıyla oluşturun. Dize kaynaklarını içeren metin dosyaları aşağıdaki biçime sahiptir:

# This is an optional comment.
name = value

; This is another optional comment.
name = value

; The following supports conditional compilation if X is defined.
#ifdef X
name1=value1
name2=value2
#endif

# The following supports conditional compilation if Y is undefined.
#if !Y
name1=value1
name2=value2
#endif

.txt ve .restext dosyalarının kaynak dosya biçimi aynıdır. .restext dosya uzantısı yalnızca metin dosyalarının metin tabanlı kaynak dosyaları olarak hemen tanımlanabilmesi için hizmet verir.

Dize kaynakları ad/değer çiftleri olarak görünür; burada ad kaynağı tanımlayan bir dizedir ve değer gibi ResourceManager.GetStringbir kaynak alma yöntemine ad geçirdiğinizde döndürülen kaynak dizesidir. ad ve değer eşittir işareti (=) ile ayrılmalıdır. Örneğin:

FileMenuName=File
EditMenuName=Edit
ViewMenuName=View
HelpMenuName=Help

Dikkat

Şifreleri, güvenlik açısından duyarlı bilgileri veya özel verileri depolamak için kaynak dosyalarını kullanmayın.

Boş dizelere (yani değeri String.Empty olan bir kaynak) metin dosyalarında izin verilir. Örneğin:

EmptyString=

.NET Framework 4.5 ve .NET Core'un tüm sürümlerinden başlayarak, metin dosyaları sembol... ve #if !sembol... #endif #endif yapılarıyla koşullu derlemeyi #ifdefdestekler. Ardından simge tanımlamak için Kaynak Dosya Oluşturucu (resgen.exe) ile anahtarı kullanabilirsiniz/define. Her kaynağın kendi #ifdefsimgesi... #endif veya #if !sembol... #endif yapısı gerekir. Bir #ifdef deyim kullanırsanız ve simge tanımlanırsa, ilişkili kaynak .resources dosyasına eklenir; aksi takdirde, eklenmez. Bir #if ! deyim kullanıyorsanız ve simge tanımlanmamışsa, ilişkili kaynak .resources dosyasına eklenir; aksi takdirde, eklenmez.

Yorumlar metin dosyalarında isteğe bağlıdır ve satır başında noktalı virgül (;) veya diyez işareti (#) ile başlanır. Yorumları içeren satırlar dosyanın herhangi bir yerine yerleştirilebilir. Açıklamalar, Kaynak Dosya Oluşturucu (resgen.exe) kullanılarak oluşturulan derlenmiş bir .resources dosyasına eklenmez.

Metin dosyasındaki tüm boş satırlar beyaz boşluk olarak değerlendirilir ve göz ardı edilir.

Aşağıdaki örnek OKButton ve CancelButton adındaki iki dize kaynağını tanımlar.

#Define resources for buttons in the user interface.
OKButton=OK
CancelButton=Cancel

Metin dosyası adın yinelenen oluşumlarını içeriyorsa, Kaynak Dosya Oluşturucu (resgen.exe) bir uyarı görüntüler ve ikinci adı yoksayar.

değeri yeni satır karakterleri içeremez, ancak yeni bir satırı temsil etmek ve \t bir sekmeyi temsil etmek için gibi \n C dil stili kaçış karakterleri kullanabilirsiniz. Ayrıca, kaçış karakteriyse bir ters eğik çizgi karakteri de ekleyebilirsiniz (örneğin, "\\"). Ayrıca, boş bir dizeye izin verilir.

UTF-8 kodlaması veya UTF-16 kodlaması kullanarak küçük endian veya büyük endian bayt sırasına göre kaynakları metin dosyası biçiminde kaydedin. Ancak, bir .txt dosyasını .resources dosyasına dönüştüren Kaynak Dosya Oluşturucu (resgen.exe) dosyaları varsayılan olarak UTF-8 olarak ele alır. Resgen.exe'nin, UTF-16 kullanılarak kodlanmış bir dosyayı tanımasını istiyorsanız, dosyanın başına bir Unicode bayt sırası işareti (U+FEFF) eklemeniz gerekir.

Bir kaynak dosyasını metin biçiminde bir .NET derlemesine eklemek için, Kaynak Dosya Oluşturucu (resgen.exe) kullanarak dosyayı ikili kaynak (.resources) dosyasına dönüştürmeniz gerekir. Daha sonra dil derleyicisi kullanarak .resources dosyasını bir .NET derlemesine ekleyebilir veya Derleme Bağlayıcısı (Al.exe) kullanarak bir uydu derlemesine ekleyebilirsiniz.

Aşağıdaki örnek, basit bir "Hello World" konsol uygulaması için GreetingResources.txt adındaki metin biçimindeki bir kaynak dosyayı kullanır. Metin dosyası, prompt greetingkullanıcıdan adını girmesini ve bir selamlama görüntülemesini isteyen iki ve dizesini tanımlar.

# GreetingResources.txt
# A resource file in text format for a "Hello World" application.
#
# Initial prompt to the user.
prompt=Enter your name:
# Format string to display the result.
greeting=Hello, {0}!

Metin dosyası, aşağıdaki komut kullanılarak bir .resources dosyasına dönüştürülür:

resgen GreetingResources.txt

Aşağıdaki örnek, kullanıcıya mesajlar göstermek için .resource dosyasını kullanan bir konsol uygulamasının kaynak kodunu gösterir.

using System;
using System.Reflection;
using System.Resources;

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("GreetingResources",
                               typeof(Example).Assembly);
      Console.Write(rm.GetString("prompt"));
      string name = Console.ReadLine();
      Console.WriteLine(rm.GetString("greeting"), name);
   }
}
// The example displays output like the following:
//       Enter your name: Wilberforce
//       Hello, Wilberforce!
Imports System.Reflection
Imports System.Resources

Module Example
    Public Sub Main()
        Dim rm As New ResourceManager("GreetingResources",
                                      GetType(Example).Assembly())
        Console.Write(rm.GetString("prompt"))
        Dim name As String = Console.ReadLine()
        Console.WriteLine(rm.GetString("greeting"), name)
    End Sub
End Module
' The example displays output like the following:
'       Enter your name: Wilberforce
'       Hello, Wilberforce!

Eğer Visual Basic kullanıyorsanız ve kaynak kod dosyanız Greeting.vb olarak adlandırılmışsa aşağıdaki komut, gömülü .resources dosyasını içeren yürütülebilir bir dosya oluşturur:

vbc greeting.vb -resource:GreetingResources.resources

Eğer C# kullanıyorsanız ve kaynak kod dosyanız Greeting.cs olarak adlandırılmışsa aşağıdaki komut, gömülü .resources dosyasını içeren yürütülebilir bir dosya oluşturur:

csc greeting.cs -resource:GreetingResources.resources

.resx dosyalarındaki kaynaklar

Yalnızca dize kaynaklarını depolayabilen metin dosyalarından farklı olarak XML kaynak (.resx) dosyaları; dizeleri, resimler, simgeler ve ses klipleri gibi ikili verileri ve programatik nesneleri depolayabilir. Bir .resx dosyası, kaynak girdilerinin biçimini açıklayan ve verileri ayrıştırmak için kullanılan XML'ye ait sürüm oluşturma bilgilerini belirten standart bir başlık içerir. Kaynak dosya verisi XML başlığını izler. Her bir veri öğesi, bir data etiketi içinde bulunan bir isim/değer ikilisinden oluşur. Kendi name özniteliği kaynak adını tanımlar ve iç içe value etiketi kaynak değerini içerir. Dize verisi için, value etiketi dizeyi içerir.

Örneğin aşağıdaki data etiketi, değeri "Adınızı girin:" olan prompt adındaki bir dize kaynağını tanımlar.

<data name="prompt" xml:space="preserve">
  <value>Enter your name:</value>
</data>

Dikkat

Şifreleri, güvenlik açısından duyarlı bilgileri veya özel verileri depolamak için kaynak dosyalarını kullanmayın.

Kaynak nesneleri için veri etiketi, kaynağın veri türünü gösteren bir type öznitelik içerir. İkili verilerden oluşan nesneler için data etiketi, aynı zamanda ikili verilerin mimetype türünü gösteren bir base64 özniteliğini içerir.

Not

Tüm .resx dosyaları, belirli bir tür için ikili verileri oluşturmak ve ayrıştırmak amacıyla bir ikili seri biçimlendirici kullanır. Sonuç olarak, bir nesnenin ikili serileştirme biçimi uyumsuz bir şekilde değişirse bir .resx dosyası geçersiz hale gelebilir.

Aşağıdaki örnek, bir Int32 kaynağını ve bir eşlem görüntüsünü içeren .resx dosyasının bir bölümünü gösterir.

<data name="i1" type="System.Int32, mscorlib">
  <value>20</value>
</data>

<data name="flag" type="System.Drawing.Bitmap, System.Drawing,
    Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    mimetype="application/x-microsoft.net.object.bytearray.base64">
  <value>
    AAEAAAD/////AQAAAAAAAAAMAgAAADtTeX…
  </value>
</data>

Önemli

.resx dosyaları, önceden tanımlanmış formatta doğru biçimlendirilmiş XML'lerden oluşması gerektiğinden özellikle .resx dosyaları dizeler haricinde kaynaklar içerdiğinde .resx dosyalarıyla el ile çalışılmasını önermeyiz. Bunun yerine, Visual Studio .resx dosyalarını oluşturmak ve işlemek için saydam bir arabirim sağlar. Daha fazla bilgi için Visual Studio'daki Kaynak dosyaları bölümüne bakın. .resx dosyalarını aynı zamanda program aracılığıyla oluşturabilir ve değiştirebilirsiniz. Daha fazla bilgi için bkz . Program aracılığıyla .resx dosyalarıyla çalışma.

.resources dosyalarındaki kaynaklar

İkili bir kaynak (.resources) dosyasını program aracılığıyla doğrudan koddan oluşturmak için System.Resources.ResourceWriter sınıfını kullanabilirsiniz. Bir metin dosyasından veya .resx dosyasından .resources dosyası oluşturmak için Kaynak Dosya Oluşturucu(resgen.exe) da kullanabilirsiniz. .resources dosyası, dize verilerine ek olarak ikili verileri (bayt dizileri) ve nesne verilerini içerebilir. Bir .resources dosyasının program aracılığıyla oluşturulması aşağıdaki adımları gerektirir:

  1. Benzersiz bir dosya adı ile bir ResourceWriter nesnesi oluşturun. Bunu, bir ResourceWriter sınıf yapıcısına bir dosya adı veya bir dosya akışı belirterek gerçekleştirebilirsiniz.

  2. Dosyaya eklemek için, adlandırılmış her bir kaynağa ait ResourceWriter.AddResource yönteminin aşırı yüklemelerinden birini çağırın. Kaynak bir dize, bir nesne veya bir ikili veri koleksiyonu (bir bayt dizisi) olabilir.

  3. Kaynakları dosyaya yazmak ve ResourceWriter.Close nesnesini kapatmak için ResourceWriter yöntemini çağırın.

Dikkat

Şifreleri, güvenlik açısından duyarlı bilgileri veya özel verileri depolamak için kaynak dosyalarını kullanmayın.

Aşağıdaki örnek, altı dizeyi, bir simgeyi ve uygulama tanımlı iki nesneyi (iki Automobile nesnesi) depolayan CarResources.resources adındaki bir .resources dosyasını progam aracılığıyla oluşturur. Örnekte Automobile tanımlanan ve örneklenen sınıfı, ikili serileştirme biçimlendiricisi tarafından kalıcı hale getirilmesini sağlayan özniteliğiyle SerializableAttribute etiketlenir.

using System;
using System.Drawing;
using System.Resources;

[Serializable()] public class Automobile
{
   private string carMake;
   private string carModel;
   private int carYear;
   private int carDoors;
   private int carCylinders;

   public Automobile(string make, string model, int year) :
                     this(make, model, year, 0, 0)
   { }

   public Automobile(string make, string model, int year,
                     int doors, int cylinders)
   {
      this.carMake = make;
      this.carModel = model;
      this.carYear = year;
      this.carDoors = doors;
      this.carCylinders = cylinders;
   }

   public string Make {
      get { return this.carMake; }
   }

   public string Model {
      get { return this.carModel; }
   }

   public int Year {
      get { return this.carYear; }
   }

   public int Doors {
      get {
         return this.carDoors; }
   }

   public int Cylinders {
      get {
         return this.carCylinders; }
   }
}

public class Example
{
   public static void Main()
   {
      // Instantiate an Automobile object.
      Automobile car1 = new Automobile("Ford", "Model N", 1906, 0, 4);
      Automobile car2 = new Automobile("Ford", "Model T", 1909, 2, 4);
      // Define a resource file named CarResources.resx.
      using (ResourceWriter rw = new ResourceWriter(@".\CarResources.resources"))
      {
         rw.AddResource("Title", "Classic American Cars");
         rw.AddResource("HeaderString1", "Make");
         rw.AddResource("HeaderString2", "Model");
         rw.AddResource("HeaderString3", "Year");
         rw.AddResource("HeaderString4", "Doors");
         rw.AddResource("HeaderString5", "Cylinders");
         rw.AddResource("Information", SystemIcons.Information);
         rw.AddResource("EarlyAuto1", car1);
         rw.AddResource("EarlyAuto2", car2);
      }
   }
}
Imports System.Drawing
Imports System.Resources

<Serializable()> Public Class Automobile
    Private carMake As String
    Private carModel As String
    Private carYear As Integer
    Private carDoors AS Integer
    Private carCylinders As Integer

    Public Sub New(make As String, model As String, year As Integer)
        Me.New(make, model, year, 0, 0)
    End Sub

    Public Sub New(make As String, model As String, year As Integer,
                   doors As Integer, cylinders As Integer)
        Me.carMake = make
        Me.carModel = model
        Me.carYear = year
        Me.carDoors = doors
        Me.carCylinders = cylinders
    End Sub

    Public ReadOnly Property Make As String
        Get
            Return Me.carMake
        End Get
    End Property

    Public ReadOnly Property Model As String
        Get
            Return Me.carModel
        End Get
    End Property

    Public ReadOnly Property Year As Integer
        Get
            Return Me.carYear
        End Get
    End Property

    Public ReadOnly Property Doors As Integer
        Get
            Return Me.carDoors
        End Get
    End Property

    Public ReadOnly Property Cylinders As Integer
        Get
            Return Me.carCylinders
        End Get
    End Property
End Class

Module Example
    Public Sub Main()
        ' Instantiate an Automobile object.
        Dim car1 As New Automobile("Ford", "Model N", 1906, 0, 4)
        Dim car2 As New Automobile("Ford", "Model T", 1909, 2, 4)
        ' Define a resource file named CarResources.resx.
        Using rw As New ResourceWriter(".\CarResources.resources")
            rw.AddResource("Title", "Classic American Cars")
            rw.AddResource("HeaderString1", "Make")
            rw.AddResource("HeaderString2", "Model")
            rw.AddResource("HeaderString3", "Year")
            rw.AddResource("HeaderString4", "Doors")
            rw.AddResource("HeaderString5", "Cylinders")
            rw.AddResource("Information", SystemIcons.Information)
            rw.AddResource("EarlyAuto1", car1)
            rw.AddResource("EarlyAuto2", car2)
        End Using
    End Sub
End Module

.resources dosyasını oluşturduktan sonra, dil derleyicisinin /resource anahtarını ekleyerek çalışma zamanı yürütülebilir dosyasına veya kitaplığına ekleyebilir veya Derleme Bağlayıcısı (Al.exe) kullanarak bir uydu derlemesine ekleyebilirsiniz.

Visual Studio'da kaynak dosyaları

Visual Studio projenize bir kaynak dosyası eklediğinizde, Visual Studio proje dizininde bir .resx dosyası oluşturur. Visual Studio, dizeler, görüntüler ve ikili nesneleri eklemenizi sağlayan kaynak düzenleyicileri sağlar. Düzenleyiciler yalnızca statik verileri işlemek için tasarlandığından programatik nesneleri depolamak için kullanılamazlar; nesne verilerini bir .resx dosyasına veya bir .resources dosyasına program aracılığıyla yazmanız gerekir. Daha fazla bilgi için program aracılığıyla .resx dosyalarıyla çalışma ve .resources dosyalarındaki kaynaklar bölümüne bakın.

Yerelleştirilmiş kaynaklar ekliyorsanız, ana kaynak dosyasıyla aynı kök dosya adını verin. Ayrıca, dosya adında kültürlerini de belirtmelisiniz. Örneğin Resources.resx adlı bir kaynak dosyası eklerseniz, sırasıyla İngilizce (Birleşik Devletler) ve Fransızca (Fransa) kültürleri için yerelleştirilmiş kaynakları tutmak üzere Resources.en-US.resx ve Resources.fr-FR.resx adlı kaynak dosyaları da oluşturabilirsiniz. Ayrıca uygulamanın varsayılan kültürünü de belirlemeniz gerekir. Bu, kaynakları belirli bir kültüre ait yerelleştirilmiş kaynaklar bulunamadığında kullanılan kültürdür.

Varsayılan kültürü belirtmek için Visual Studio'daki Çözüm Gezgini:

  • Proje özelliklerini açın, projeye sağ tıklayın ve Özellikler'i (veya proje seçildiğinde Alternatif + Enter'ı) seçin.
  • Paket sekmesini seçin.
  • Genel alanında, Derleme nötr dil denetiminden uygun dili/kültürü seçin.
  • Değişikliklerinizi kaydedin.

Derleme zamanında, Visual Studio önce bir projedeki .resx dosyalarını ikili kaynak (.resources) dosyalarına dönüştürür ve bunları projenin obj dizininin bir alt dizininde depolar. Visual Studio, proje tarafından oluşturulmuş ana derlemede yerelleştirilmiş kaynaklar içermeyen tüm kaynak dosyalarını gömer. Eğer herhangi bir kaynak dosyası yerelleştirilmiş kaynakları içeriyorsa Visual Studio her bir yerelleştirilmiş için bu kaynakları ayrı uydu derlemelerine gömer. Ardından her uydu derlemesini adı yerelleştirilmiş kültüre karşılık gelen bir dizinde depolar. Örneğin, yerelleştirilmiş İngilizce (Amerika Birleşik Devletleri) kaynakları, en-US alt dizinindeki bir uydu derlemesinde depolanır.

Ayrıca bkz.