Assembly | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar assembly

C#’ta assembly: InternalsVisibleToAttribute kullanımı

16 July 2016 Yorum yapılmamış

C#‘ta kullanabildiğimiz erişim belirleyicileri (Access Modifiers) daha önce C# Erişim Belirleyiciler – Access Modifiers isimli makalede ele almıştım.

C# kurallarına göre, bir proje diğer projeyi referans olarak görüyorsa public erişim belirleyicili (access modifier) olan class‘lara erişebilir. internal access modifier olan class‘lara ise referans olarak gören projeden erişilemez, sadece tanımlandığı projeden erişilebilir.

Göstermesi, anlatmasından kolay olacak sanırım.

Hemen Visual Studio 2015 açalım ve yeni bir Console Application projesi oluşturalım;

Solution‘a sağ tuşla tıklayalım ve Add Project menüsünden bir tane Class Library ekleyelim ve Class1.cs dosyasının ismini VeritabaniErisimi.cs olacak şekilde değiştirelim;

Yeni oluşturduğumuz Class Library projesini Console Application projesinin referans‘larına ekleyelim;

Böylece solution‘ımız aşağıdaki gibi gözükmeli;

VeritabaniErisimi.cs dosyasını açalım ve VeritabaniErisimi class‘ının erişim belirleyicisini (Access Modifier) internal yapalım.

Console Application projesindeki Program.cs dosyasını açar ve içerisinden VeritabaniErisimi isimli class‘a erişmek istersek, internal access modifier‘ına sahip olduğu için erişemeyeceğiz.

Bu noktada proje derlenemez ve ‘VeritabaniErisimi’ is inaccessible due to its protection level hatası verir.

Çünkü; internal access modifier‘ına sahip class‘lar sadece kendi projelerinde kullanılabilir, erişebilirlerdir. Kendi projelerinin dışından erişilemezler.

Eğer istersek, Kutuphane isimli Class Library‘deki internal access modifier‘ına sahip sınıfların başka projelerden de erişilebilir olmasını sağlayabiliriz.

Bunun için namespace üstünde InternalsVisibleTo Attribute‘ünü kullanmamız lazım.

Öncelikle VeritabaniErisimi.cs dosyasını açalım (aslında Kutuphane projesindeki herhangi bir csharp dosyasını açsak olur) ve using kısmına System.Runtime.CompilerServices ekleyelim, namespace üzerine de [assembly: InternalsVisibleTo(“PROJEADI”)] yazalım.

InternalsVisibelTo attribute‘ünün parametresi olan PROJEADI, internal access modifier‘ına sahip class‘ların görünür olmasını istediğimiz projelerin adı olmalı. Örneğin;

C# Global Assembly Cache içine Assembly yüklemek

21 December 2011 1 yorum

C# ile geliştirdiğimiz uygulamalar büyüdükçe, uygulama içerisinde ortak kullandığımız yapıları tekilleştirme eğilimi gösteririz. Örneğin; veritabanına erişim, e-posta gönderme, hata geribildirimleri, session kontrolü, vs.

Tekilleştirme yapmak için, ortak metodları, ortak bir sınıf içerisinde toplar ve projenin her yerinde ilgili sınıf üzerinden kullanırız. Örneğin;
DAL.ExecuteQuery();
DAL.ExecuteProcedure();
DAL.GetDataTable();

Ortak metodlar çoğaldıkça, ortak bir sınıf yeterli olmaz ve ortak sınıflar oluşturmamız gerekir.Örneğin;
Hata.Log(ex);
DAL.ExecuteQuery(“sorgu”, “parametreler”);
EMail.Send(“alıcı”, “konu”, “içerik”);

Eğer ortak sınıflarımızı çeşitli projeler arasında paylaşmamız gerekiyorsa, bu sınıfları dll assembly‘ler içerisinde toplarız.

Daha sonra her projede, dll assembly’yi projenin referanslarına ekleriz.

Birden fazla projede referans olarak göstereceksek, dll assembly’yi ortak bir alana yüklememiz daha doğru olacaktır.

Böylece ilgili dll’de yapacağımız bir versiyon güncellemesi aynı anda birden fazla projede etkin olacaktır.

.Net dll’lerini koyabildiğimiz ortak alana Global Assembly Cache (kısaca GAC) denmektedir.

Bir .Net assembly’sini GAC‘a eklemek için, .Net Framework ile birlikte gelen gacutil aracını kullanmalıyız. Örnek Kullanım : gacutil -i [assembly_yolu]

Komut satırından gerekli parametreleri vererek gacutil aracını kullanabiliriz.

Eğer, bir assembly’yi GAC’a programatik bir yöntemle eklemek istiyorsak, System.EnterpriseServices.Internal namespace’inde yeralan Publish sınıfının GacInstall method’unu kullanmalıyız.

İlk olarak kodumuzun using kısmına System.EnterpriseServices.Internal namespace’ini ekleyelim;

using System.EnterpriseServices.Internal;

Daha sonra yapmamız gereken, Publish sınıfından yeni bir örnek oluşturup, GacInstall method’unu çağırmak.

try
{
	Publish gac = new Publish();
	gac.GacInstall("yuklenecekassemblyyolu");
}
catch (System.Security.SecurityException se)
{
	///Muhtemelen yetki eksikliğinden dolayı uygulamamız GAC'a erişemedi
}

Özellikle, kendi kurulum uygulamamızı yazacaksak, GAC‘a programatik erişmemiz gerekecektir.

Uygulamanın Referans Listesini Almak

20 November 2011 Yorum yapılmamış

Çalışma zamanında (Run-Time) uygulamanın referans olarak kullandığı assembly‘lerin (dll) listesini almak için aşağıdaki LINQ sorgusunu kullanabilirsiniz;

var assemblies = from assemblyName in Assembly.GetExecutingAssembly().GetReferencedAssemblies()
let assembly = Assembly.Load(assemblyName)
let companies = assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false)
where companies.Length > 0 && (companies[0] as AssemblyCompanyAttribute).Company != "Microsoft Corporation"
select assembly;

Assembly sınıfının static GetExecutingAssembly() method’unu kullanarak çalışan assembly‘ye ulaşabiliriz.

GetReferencedAssemblies() method’u ilgili Assembly‘nin referans olarak kullandığı assembly‘lerin listesini döndürür.

Assembly sınıfının static Load() method’u ile ilgili assembly hafızaya yüklenir.

GetCustomAttributes() method’u ile ilgili assembly‘nin çeşitli meta bilgileri sorgulanabilir. Örneğin;

AssemblyCompanyAttribute bilgisini aldıktan sonra, Microsoft Corporation değerinden farklı olduğunu kontrol ederek, Microsoft firması haricinde firmaların referans assembly‘lerini bulabiliriz.

Son olarak, basit bir foreach döngüsü ile assembly listesini ekrana yazdırabiliriz;

foreach (var assembly in assemblies)
{
	Console.WriteLine(assembly.FullName);
}

C# Speech Synthesis – Konuşma Sentezleyici

25 January 2010 Yorum yapılmamış

Eğer uygulamanızda, Text-to-Speech (TTS) yeteneği olmasını istiyorsanız, .Net Framework içerisinde bunu yapmanızı sağlayacak sınıflar mevcut.

Projenizde Text-To-Speech sınıflarını kullanabilmek için, System.Speech.Synthesis namespace’indeki sınıflara erişebilmeniz gereklidir.

System.Speech.Synthesis namespace’ine, projenize System.Speech.dll assembly’yi referans olarak ekleyerek ulaşabilirsiniz.

Text-to-Speech kullanmak istediğiniz sınıfın bulunduğu kod dosyasının en üstünde bulunan using‘leri yazdığınız kısma;

using System.Speech.Synthesis;

satırını ekleyiniz. Daha sonra yapmanız gereken, kodunuzun ilgili yerine aşağıdaki kod parçasını eklemek;

SpeechSynthesizer ss = new SpeechSynthesizer();
ss.Speak("Konuşmaya çevrilecek ve hoparlörden duyulacak metin");

Uygulama çalışırken, ilgili satıra geldiğinde, önce Speak() methoduna parametre olarak verdiğiniz string hoparlörden duyulur, sonra bir sonraki satırdan çalışmaya devam eder.

Eğer metnin konuşmaya çevrilme işleminin uzun sürdüğünü ve uygulamanıza “yavaşlık” kattığını düşünüyorsanız, aynı kodu aşağıdaki gibi yazabilirsiniz;

SpeechSynthesizer ss = new SpeechSynthesizer();
ss.SpeakAsync("Konuşmaya çevrilecek ve hoparlörden duyulacak metin");

SpeakAsync() method’u sayesinde, uygulama metnin konuşmaya çevrilmesi ve ses kartı aracılığıyla yayınlanması işlemini ayrı bir iş parçacığında gerçekleştirir.

Not : Speak() method’u ingilizce kelimeleri doğru olarak okuyor, fakat türkçe kelimeleri okuyamıyor.

Kısa Sınav – 3

01 December 2009 Yorum yapılmamış

ClickOnce ile deploy ettiğiniz uygulamanızda, programatik olarak güncelleme olup olmadığını kontrol etmek istiyorsunuz.

Hangi class’tan örnek oluşturmanız lazım?

  • Module
  • ApplicationDeployment
  • Assembly
  • DeploymentServiceCom

Sorunun doğru cevabı için; Devamını oku…