Program aracılığıyla .resx dosyalarıyla çalışma
Not
Bu makale .NET Framework için geçerlidir. .NET 5+ (.NET Core dahil) için geçerli olan bilgiler için bkz . .resx dosyalarındaki kaynaklar.
XML kaynağı (.resx) dosyaları, ad/değer çiftlerindeki verilerin ardından belirli bir şemayı izlemesi gereken bir üst bilgi de dahil olmak üzere iyi tanımlanmış XML'yi içermesi gerektiğinden, bu dosyaları el ile oluşturmanın hataya açık olduğunu fark edebilirsiniz. Alternatif olarak, .NET Sınıf Kitaplığı'ndaki türleri ve üyeleri kullanarak program aracılığıyla .resx dosyaları oluşturabilirsiniz. .RESX dosyalarında depolanan kaynakları almak için .NET Sınıf Kitaplığı'nı da kullanabilirsiniz. Bu makalede, .resx dosyalarıyla çalışmak için ad alanında System.Resources türleri ve üyeleri nasıl kullanabileceğiniz açıklanmaktadır.
Bu makalede, kaynak içeren XML (.resx) dosyalarıyla çalışma açıklanır. Derlemelere eklenmiş ikili kaynak dosyalarıyla çalışma hakkında bilgi için bkz ResourceManager. .
Uyarı
Program aracılığıyla dışındaki .resx dosyalarıyla çalışmanın da yolları vardır. Visual Studio projesine kaynak dosyası eklediğinizde, Visual Studio bir .resx dosyası oluşturmak ve korumak için bir arabirim sağlar ve derleme zamanında .resx dosyasını otomatik olarak bir .resources dosyasına dönüştürür. Bir .resx dosyasını doğrudan işlemek için bir metin düzenleyicisi de kullanabilirsiniz. Ancak, dosyanın bozulmasını önlemek için, dosyada depolanan ikili bilgileri değiştirmemeye dikkat edin.
.resx dosyası oluşturma
sınıfını System.Resources.ResXResourceWriter kullanarak şu adımları izleyerek program aracılığıyla bir .resx dosyası oluşturabilirsiniz:
yöntemini çağırarak ResXResourceWriter(String) ve .resx dosyasının adını sağlayarak bir ResXResourceWriter nesne örneği oluşturun. Dosya adı .resx uzantısını içermelidir. Nesnenin örneğini ResXResourceWriter bir
using
blokta oluşturursanız, 3. adımda yöntemini açıkça çağırmanız ResXResourceWriter.Close gerekmez.Dosyaya ResXResourceWriter.AddResource eklemek istediğiniz her kaynak için yöntemini çağırın. Dize, nesne ve ikili (bayt dizisi) verileri eklemek için bu yöntemin aşırı yüklemelerini kullanın. Kaynak bir nesneyse serileştirilebilir olmalıdır.
ResXResourceWriter.Close Kaynak dosyasını oluşturmak ve tüm kaynakları serbest bırakmak için yöntemini çağırın. ResXResourceWriter Nesne bir
using
blok içinde oluşturulduysa, kaynaklar .resx dosyasına yazılır ve nesne tarafından ResXResourceWriter kullanılan kaynaklar bloğunusing
sonunda serbest bırakılır.
Sonuçta elde edilen .resx dosyası, yöntemi tarafından eklenen her kaynak için uygun üst bilgi ve data
etikete ResXResourceWriter.AddResource sahiptir.
Uyarı
Şifreleri, güvenlik açısından duyarlı bilgileri veya özel verileri depolamak için kaynak dosyalarını kullanmayın.
Aşağıdaki örnek, altı dize, bir simge ve iki uygulama tanımlı nesne (iki Automobile
nesne) depolayan CarResources.resx adlı bir .resx dosyası oluşturur. Örnekte Automobile
tanımlanan ve örneği oluşturulmuş olan sınıfı özniteliğiyle SerializableAttribute etiketlenmiş.
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 (ResXResourceWriter resx = new ResXResourceWriter(@".\CarResources.resx"))
{
resx.AddResource("Title", "Classic American Cars");
resx.AddResource("HeaderString1", "Make");
resx.AddResource("HeaderString2", "Model");
resx.AddResource("HeaderString3", "Year");
resx.AddResource("HeaderString4", "Doors");
resx.AddResource("HeaderString5", "Cylinders");
resx.AddResource("Information", SystemIcons.Information);
resx.AddResource("EarlyAuto1", car1);
resx.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 resx As New ResXResourceWriter(".\CarResources.resx")
resx.AddResource("Title", "Classic American Cars")
resx.AddResource("HeaderString1", "Make")
resx.AddResource("HeaderString2", "Model")
resx.AddResource("HeaderString3", "Year")
resx.AddResource("HeaderString4", "Doors")
resx.AddResource("HeaderString5", "Cylinders")
resx.AddResource("Information", SystemIcons.Information)
resx.AddResource("EarlyAuto1", car1)
resx.AddResource("EarlyAuto2", car2)
End Using
End Sub
End Module
İpucu
.resx dosyaları oluşturmak için Visual Studio'yu da kullanabilirsiniz. Derleme zamanında Visual Studio, .resx dosyasını ikili kaynak (.resources) dosyasına dönüştürmek için Kaynak Dosya Oluşturucu'yu (Resgen.exe) kullanır ve bunu bir uygulama derlemesine veya uydu derlemesine ekler.
Bir .resx dosyasını çalışma zamanı yürütülebilir dosyasına ekleyemez veya bir uydu derlemesinde derleyemezsiniz. Kaynak Dosya Oluşturucu(Resgen.exe) kullanarak .resx dosyanızı ikili kaynak (.resources) dosyasına dönüştürmeniz gerekir. Sonuçta elde edilen .resources dosyası bir uygulama derlemesine veya uydu derlemesine eklenebilir. Daha fazla bilgi için bkz . Kaynak dosyaları oluşturma.
Kaynakları listeleme
Bazı durumlarda, .resx dosyasından belirli bir kaynak yerine tüm kaynakları almak isteyebilirsiniz. Bunu yapmak için ,resx dosyasındaki System.Resources.ResXResourceReader tüm kaynaklar için bir numaralandırıcı sağlayan sınıfını kullanabilirsiniz. sınıfı, döngünün System.Resources.ResXResourceReader her yinelemesi için belirli bir DictionaryEntry kaynağı temsil eden bir nesne döndüren öğesini uygularIDictionaryEnumerator. Özelliği DictionaryEntry.Key kaynağın anahtarını, özelliği ise DictionaryEntry.Value kaynağın değerini döndürür.
Aşağıdaki örnek, önceki örnekte oluşturulan CarResources.resx dosyası için bir ResXResourceReader nesne oluşturur ve kaynak dosyası aracılığıyla yinelenir. Kaynak dosyasında tanımlanan iki Automobile
nesneyi bir System.Collections.Generic.List<T> nesneye ekler ve bir nesneye SortedList altı dizeden beşini ekler. Nesnedeki değerler, konsolda SortedList sütun başlıklarını görüntülemek için kullanılan parametre dizisine dönüştürülür. Özellik Automobile
değerleri konsolunda da görüntülenir.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Resources;
public class Example
{
public static void Main()
{
string resxFile = @".\CarResources.resx";
List<Automobile> autos = new List<Automobile>();
SortedList headers = new SortedList();
using (ResXResourceReader resxReader = new ResXResourceReader(resxFile))
{
foreach (DictionaryEntry entry in resxReader) {
if (((string) entry.Key).StartsWith("EarlyAuto"))
autos.Add((Automobile) entry.Value);
else if (((string) entry.Key).StartsWith("Header"))
headers.Add((string) entry.Key, (string) entry.Value);
}
}
string[] headerColumns = new string[headers.Count];
headers.GetValueList().CopyTo(headerColumns, 0);
Console.WriteLine("{0,-8} {1,-10} {2,-4} {3,-5} {4,-9}\n",
headerColumns);
foreach (var auto in autos)
Console.WriteLine("{0,-8} {1,-10} {2,4} {3,5} {4,9}",
auto.Make, auto.Model, auto.Year,
auto.Doors, auto.Cylinders);
}
}
// The example displays the following output:
// Make Model Year Doors Cylinders
//
// Ford Model N 1906 0 4
// Ford Model T 1909 2 4
Imports System.Collections
Imports System.Collections.Generic
Imports System.Resources
Module Example
Public Sub Main()
Dim resxFile As String = ".\CarResources.resx"
Dim autos As New List(Of Automobile)
Dim headers As New SortedList()
Using resxReader As New ResXResourceReader(resxFile)
For Each entry As DictionaryEntry In resxReader
If CType(entry.Key, String).StartsWith("EarlyAuto") Then
autos.Add(CType(entry.Value, Automobile))
Else If CType(entry.Key, String).StartsWith("Header") Then
headers.Add(CType(entry.Key, String), CType(entry.Value, String))
End If
Next
End Using
Dim headerColumns(headers.Count - 1) As String
headers.GetValueList().CopyTo(headerColumns, 0)
Console.WriteLine("{0,-8} {1,-10} {2,-4} {3,-5} {4,-9}",
headerColumns)
Console.WriteLine()
For Each auto In autos
Console.WriteLine("{0,-8} {1,-10} {2,4} {3,5} {4,9}",
auto.Make, auto.Model, auto.Year,
auto.Doors, auto.Cylinders)
Next
End Sub
End Module
' The example displays the following output:
' Make Model Year Doors Cylinders
'
' Ford Model N 1906 0 4
' Ford Model T 1909 2 4
Belirli bir kaynağı alma
.resx dosyasındaki öğeleri listelemeye ek olarak, sınıfını System.Resources.ResXResourceSet kullanarak belirli bir kaynağı ada göre alabilirsiniz. yöntemi, ResourceSet.GetString(String) adlandırılmış dize kaynağının değerini alır. yöntemi, ResourceSet.GetObject(String) adlandırılmış bir nesnenin veya ikili verilerin değerini alır. yöntemi, daha sonra (C# dilinde) veya (Visual Basic'te) uygun türde bir nesneye dönüştürülmesi gereken bir nesne döndürür.
Aşağıdaki örnek, bir formun başlık dizesini ve simgesini kaynak adlarına göre alır. Ayrıca önceki örnekte kullanılan uygulama tanımlı Automobile
nesneleri alır ve bunları bir DataGridView denetimde görüntüler.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Resources;
using System.Windows.Forms;
public class CarDisplayApp : Form
{
private const string resxFile = @".\CarResources.resx";
Automobile[] cars;
public static void Main()
{
CarDisplayApp app = new CarDisplayApp();
Application.Run(app);
}
public CarDisplayApp()
{
// Instantiate controls.
PictureBox pictureBox = new PictureBox();
pictureBox.Location = new Point(10, 10);
this.Controls.Add(pictureBox);
DataGridView grid = new DataGridView();
grid.Location = new Point(10, 60);
this.Controls.Add(grid);
// Get resources from .resx file.
using (ResXResourceSet resxSet = new ResXResourceSet(resxFile))
{
// Retrieve the string resource for the title.
this.Text = resxSet.GetString("Title");
// Retrieve the image.
Icon image = (Icon) resxSet.GetObject("Information", true);
if (image != null)
pictureBox.Image = image.ToBitmap();
// Retrieve Automobile objects.
List<Automobile> carList = new List<Automobile>();
string resName = "EarlyAuto";
Automobile auto;
int ctr = 1;
do {
auto = (Automobile) resxSet.GetObject(resName + ctr.ToString());
ctr++;
if (auto != null)
carList.Add(auto);
} while (auto != null);
cars = carList.ToArray();
grid.DataSource = cars;
}
}
}
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Resources
Imports System.Windows.Forms
Public Class CarDisplayApp : Inherits Form
Private Const resxFile As String = ".\CarResources.resx"
Dim cars() As Automobile
Public Shared Sub Main()
Dim app As New CarDisplayApp()
Application.Run(app)
End Sub
Public Sub New()
' Instantiate controls.
Dim pictureBox As New PictureBox()
pictureBox.Location = New Point(10, 10)
Me.Controls.Add(pictureBox)
Dim grid As New DataGridView()
grid.Location = New Point(10, 60)
Me.Controls.Add(grid)
' Get resources from .resx file.
Using resxSet As New ResXResourceSet(resxFile)
' Retrieve the string resource for the title.
Me.Text = resxSet.GetString("Title")
' Retrieve the image.
Dim image As Icon = CType(resxSet.GetObject("Information", True), Icon)
If image IsNot Nothing Then
pictureBox.Image = image.ToBitmap()
End If
' Retrieve Automobile objects.
Dim carList As New List(Of Automobile)
Dim resName As String = "EarlyAuto"
Dim auto As Automobile
Dim ctr As Integer = 1
Do
auto = CType(resxSet.GetObject(resName + ctr.ToString()), Automobile)
ctr += 1
If auto IsNot Nothing Then carList.Add(auto)
Loop While auto IsNot Nothing
cars = carList.ToArray()
grid.DataSource = cars
End Using
End Sub
End Class
.resx dosyalarını ikili .resources dosyalarına dönüştürme
.resx dosyalarını eklenmiş ikili kaynak (.resources) dosyalarına dönüştürmenin önemli avantajları vardır. .resx dosyalarının uygulama geliştirme sırasında okunup bakımı kolay olsa da, bunlar nadiren tamamlanmış uygulamalara dahil edilir. Bir uygulamayla dağıtılırlarsa, uygulama yürütülebilir dosyası ve eşlik eden kitaplıklarından ayrı dosyalar olarak bulunurlar. Buna karşılık, .resources dosyaları uygulamanın yürütülebilir dosyalarına veya eşlik eden derlemelerine eklenir. Ayrıca, yerelleştirilmiş uygulamalar için çalışma zamanında .resx dosyalarına güvenmek, geliştiriciye kaynak geri dönüşünü işleme sorumluluğunu getirir. Buna karşılık, eklenmiş .resources dosyalarını içeren bir dizi uydu derlemesi oluşturulduysa, ortak dil çalışma zamanı kaynak geri dönüş işlemini işler.
Bir .resx dosyasını .resources dosyasına dönüştürmek için, aşağıdaki temel söz dizimine sahip Olan Kaynak Dosya Oluşturucu(resgen.exe) kullanırsınız:
resgen.exe .resxFilename
Sonuç, .resx dosyası ve .resources dosya uzantısıyla aynı kök dosya adına sahip bir ikili kaynak dosyasıdır. Bu dosya daha sonra bir yürütülebilir dosya veya derleme zamanında bir kitaplıkta derlenebilir. Visual Basic derleyicisini kullanıyorsanız, uygulamanın yürütülebilir dosyasına bir .resources dosyası eklemek için aşağıdaki söz dizimini kullanın:
vbc filename .vb -resource: .resourcesFilename
C# kullanıyorsanız söz dizimi aşağıdaki gibidir:
csc filename .cs -resource: .resourcesFilename
.resources dosyası, aşağıdaki temel söz dizimine sahip Assembly Linker (al.exe) kullanılarak bir uydu derlemesine de eklenebilir:
al resourcesFilename -out: assemblyFilename