.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 #ifdef
destekler. Ardından simge tanımlamak için Kaynak Dosya Oluşturucu (resgen.exe) ile anahtarı kullanabilirsiniz/define
. Her kaynağın kendi #ifdef
simgesi... #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
greeting
kullanı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:
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.
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.
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.