c# ta kaynak dosyalarının kullanımı
Bir uygulamanın içindeki kaynaklar neler olabilir; resimler, müzikler ve yazılar(string). Bu makalede bu tür kaynakların, harici olarak programımıza nasıl ekleneceğini öğreneceğiz. Derlenmiş bir program içerisinde bir yazıyı değiştirmek çok zordur. Bu yüzden sonradan değişme ihtimali bulunan kaynakları yönetmek için .NET platformu bizim için büyük kolaylıklar sağlamıştır. Bazı durumlarda da programımızın farklı dillerdeki versiyonları olabilir. Bu durumda her dil için bir string kaynak dosyası(resource file) hazırlamamız yetecektir.
Bu makalede, .NET ile birlikte gelen ve kaynak dosyaları oluşturmada kullanılan resgen.exe adlı programı, System.Resources isimalanında bulunan ResourceWriter isimli sınıfı, ve bu oluşturulan kaynak dosyaları kullanmak için yine System.Resources isimalanında bulunan ResourceManager adlı sınıflarının kullanımını göreceğiz. Ve tabiki bunları anlatırken basit bir uygulama üzerinden anlatacağım.
Yukarıda da bahsettiğim gibi kaynak dosyalarda resim ve yazılar bulunabilir.İlk adımda basit bir .txt dosyasına istediğimiz yazıları alt alta yazalım. Resgen.exe yardımıyla bu txt dosyasından .NET platformu için özel bir kaynak dosyası oluşturacağız. Yalnız dikkat etmemiz gereken nokta şu : bu şekilde hazırlanacak bir kaynak dosyasına resimleri ekleyemiyoruz. Eğer kaynaklarımız sadece yazılar ise bu yöntemi kullanıyoruz. Eğer kaynak olarak resim eklemek istiyorsak birazdan anlatacağım ResourceWriter sınıfını kullanarak basit bir program yazacağız. Şimdi aşağıdaki terimler.txt dosyasını oluşturun.
Pointer = Gösterici
Function = Fonksiyon
Array = Dizi
Template = Şablon
yazilar.txt
Şimdi resgen.exe yardımıyla yazilar.txt den yazilar.resources adlı kaynak dosyayı oluşturalım. resgen.exe yi çalıştırmak için Start-> Programs -> Microsft Visual Studio.NET -> Visual Studio.NET Tools -> Visual Studio.NET Command Prompt yolunu kullanabilirsiniz.
Konsol ekranına
resgen yazilar.txt
yazarak yazilar.resources dosyasının oluşmasını sağlayan. yazilar.resources dosyasını bu şekilde kullanabileceğimiz gibi XML formatında bir kaynak dosyası da oluşturabiliriz. Bunun içinde konsol ekranına aşağıdaki komutu yazın.
resgen yazilar.resources yazilar.resx
Kaynak dosyalarının nasıl kullanıldığına geçmeden önce resimlerin de eklenebileceği bir kaynak dosyası hazırlayan bir program yazalım. Bu programda yukarıda da dediğim gibi System.Resources isimalanı altında bulunan ResourceWriter sınıfını kullanacağız. Bunun için aşağıdaki programı yazıyorum.
using System;
using System.Drawing;
using System.Resources;
class Class1
{
static void Main(string[] args)
{
ResourceWriter resw = new ResourceWriter(“yazilar2.resources”);
Image resim = Image.FromFile(“logo.gif”);
string anahtar,deger;
for(int i=0 ; i<=3 ; i++) { Console.Write(“Kaynak için anahtar kelime girin: “); anahtar = Console.ReadLine(); Console.WriteLine(); Console.WriteLine(“Girdiginiz anahtarin degerini girini: “); deger = Console.ReadLine(); resw.AddResource(anahtar,deger); } resw.AddResource(“Cslogo”,resim); resw.Close(); } } Biraz programı açıklamakta fayda var. Visual Studio.NET ‘de yeni bir Console Uygulaması açın. Resimlerle iş yapabilmek için daha doğrusu Image sınıfını kullanabilmek için System.Drawing isimalanını eklememiz gerekir. Bunun için Project->Add Reference menüsünü kullanıp System.Drawing.dll i için projemize referans verelim. Kaynak dosyayı oluşturmak için ise System.Resources isimalanında bulunan ResourceWriter sınıfını kullanıyoruz. Programımızın başında yeni bir ResourceWriter nesnesi oluşturuyoruz. Varsayılan yapıcı işlevine ise oluşturacağımız kaynak dosyasının ismini veriyoruz. Daha sonra kaynak dosyasına ekleyeceğimiz bir resim dosyasından Image türünden bir nesne tanımlıyoruz. Yine aynı şekilde Image sınıfının yapıcı işlevine resim dosyasının adını gönderiyoruz. Dosyanın çalışan programla aynı klasör içinde olmasına dikkat edin. Aksi halde FileNotFoundException hatası alırız. Daha sonra bir for döngüsü yardımıyla 4 defa kullanıcıdan kaynak için anahtar ve değer girilmesini istiyoruz. Kaynak dosyasına kaynakları eklemek için ResourceWriter sınıfının overload edilmiş iki üye işlevini kullanıyoruz. Bu iki üye işlevinin prototipi aşağıdaki gibidir.
public void AddResource(string, object); // bu fonksiyonu kaynağa Image nesnesini eklemek için kullanıyoruz.
public void AddResource(string, string); // bu fonksiyonu ise iki string anahtar-değer ikilisini kaynak dosyasına girmek için kullanıyoruz.
Son olarak Close işlevi ile hafızada bulunan bilgiler yazilar.resource dosyasına yazılır. Bu işlevi kullanmadığımızda bilgiler dosyaya kaydedilmeyecektir.
Bu şekilde oluşturduğumuz kaynak dosyasının resgen.exe ile oluşturduğumuzdan tek farklı kaynak dosyasına bir resim bilgisinin binary olarak yerleştirilmesidir. Kaynak dosyası oluşturmanın iki yöntemini gördükten sonra şimdi bu kaynak dosyaları bir uygulamada nasıl kullanacağımızı görelim. Bu amaçla yeni bir Windows Uygulaması başlatalım. Amacımız bir picturebox yardımıyla kaynak dosyadaki binary resim bilgilerini göstermek ve yazıları da bir label kontrolu üzerinde göstermek. Öncelikle Visual Studio.NET ‘de bulunan solution explorer penceresinden projemize hazırladığımız kaynak dosyasını eklememiz gerekir. Bunun için solution explorer’daki projemize sağ tıklayıp Add->Add Existing Item ‘dan yazilar2.resource adlı kaynak dosyasını seçelim. Bu yöntemle kaynak dosyası projemize Embed Resource olarak eklenecektir. Properties penceresindeki Build Action özelliğini kullanarak bu ayarı değiştirebiliriz. Kaynak dosyasını ekledikten sonra aşağıdaki gibi bir form penceresi tasarlayın. Form üzerine bir picturebox ve 4 tane label kontrolu ekleyin.
private void Form1_Load(object sender, System.EventArgs e)
{
ResourceManager rsm = new ResourceManager(“winAppRes.yazilar2″,Assembly.GetExecutingAssembly());
pictureBox1.Image = (Image)rsm.GetObject(“Cslogo”);
label1.Text = rsm.GetString(“Pointer”);
label2.Text = rsm.GetString(“Function”);
label3.Text = rsm.GetString(“array”);
label4.Text = rsm.GetString(“Template”);
}
Yukarıdaki metotda form1 yüklendiğinde ResourceManager yardımıyla kaynak dosyadaki bilgileri ,form üzerindeki kontrollere yerleştiriyoruz. Bu kodun çalışabilmesi için System.Reflection(Assembly sınıfı için) ve System.Resources(ResourceManager sınıfı için) isimalanlarının projeye using ile eklenmesi gerekir. İlk olarak o an üzerinde çalışılan assembly için bir ResourceManager nesnesi oluşturuyoruz. Yeni bir ResourceManager nesnesi oluştururken ResourceManager ‘in yapıcı işlevine kaynak dosyanın projedeki göreceli yolunu ve o an üzerinde çalıştığımız Assembly nesnesini geçiyoruz. Benim oluşturduğum projenin ismi winAppRes olduğu için 1. parametre “winAppres.yazilar2″ olmalıdır. (Dikkat edin 1. parametrede kaynak dosyasının uzantısı olan .resource ekini yazmadık ). 2. parametreye ise Assembly(System.Reflection) sınıfının statik üye işlevi olan GetExecutingAssembly ile dönen Assembly nesnesini geçiyoruz. Kaynak dosyasındaki verileri formun üzerindeki kontrollere yerleştirirken ResourceManager sınıfının iki ayrı üye işlevini kullanıyoruz. Bunlardan GetObject işlevi ile picturebox ‘a kaynaktaki resmi aktarıyoruz. GetObject işlevinin parametresi kaynak dosyasındaki resime ait verinin anahtar adını geçiyoruz. Hatırlarsanız kaynak dosyayı oluşturuken resim için “Cslogo” anahtarını kullanmıştık. GetObject ile geriye dönen nesne object türünden olduğu için resim bilgisini picturebox ‘a yerleştirebilmek için (Image)rsm.GetObject(“Cslogo”) ifadesiyle tür dönüşümü yapıyoruz. GetString işlevi ile de kaynak dosyasındaki yazıları alıyoruz. Bu işlevden geriye dönen değer parametre olarak verilen anahtara ait string değeri olduğu için label kontrollerinin text özelliğine atayabiliriz.
Programı derledikten sonra aşağıdaki ekran görüntüsünü elde etmelisiniz.
Not : Eğer kaynak dosyasını resgen.exe ile XML formatında hazırlasaydık yukarıdaki işlemlerin aynısı yine geçerli olacaktı. Benim tavsiyem kaynak dosyalarını XML formatında hazırlamanız yönündedir. Hem Visual Studio.NET ortamında kaynak dosyayı daha rahat düzenleyebilirsiniz hem de XML formatındaki dosyaya istediğiniz ortamlardan rahatlıkla ulaşabilirsiniz.