Oluşturduğumuz assemblyleri Global Assembly Cache'e (GAC) yüklemek için gerek gacutil konsol uygulamasını gerekse de Control Panel\Administrative Tools altındaki Microsoft .NET Framework 2.0 Configuration aracını kullanarak manuel yükleme işlemini gerçekleştirebiliyoruz.

Peki bu işlemi yardımcı araçlar ile manuel olarak değil de bazı ihtiyaçlardan dolayı :) programatik olarak gerçekleştirmek isteyebilirsiniz. Reflector ile biraz .NET'i kurcaladığımda - eh! .net framework kendi içinde böyle bir desteği mutlaka sağlıyordur mantığından yola çıkarak - aşağıdaki resimden de görebileceğiniz GacUtil isimli bir sınıf ile karşılaştım.



Aşağıdaki basit bir reflection işlemi ile kendi assembly'imizi GAC'a yükleyebiliriz.

   1:  namespace BTAkademi.TestCodes
   2:  {
   3:      class Program
   4:      {
   5:          static void Main(string[] args)
   6:          {
   7:              //GAC'dan System.Web dll'i yükleniyor
   8:              Assembly asm = Assembly.Load(@"System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
   9:   
  10:              // Type bilgisi alınıyor
  11:              Type t = asm.GetType("System.Web.Configuration.GacUtil");
  12:              // Metodu invoke edebilmek için GacUtil türünden nesne oluşturuluyor
  13:              object o = Activator.CreateInstance(t);
  14:   
  15:              //Metod bilgisi alınıyor
  16:              MethodInfo mi = o.GetType().GetMethod("GacInstall");
  17:   
  18:              //metod çağrılıyor
  19:              mi.Invoke(o, new object[] { "C:\\gacTest.dll" });
  20:   
  21:          }
  22:      }
  23:  }


Not : GAC'a yüklenmek istenen assembly'nin public key token'a sahip olması gerekmektedir.

 

13/7/2008 tarihli düzenleme :

try
{
    System.EnterpriseServices.Internal.Publish gac = new System.EnterpriseServices.Internal.Publish();
    gac.GacInstall(yuklenecekassemblyadi);
}
catch (System.Security.SecurityException se)
{

}

şeklinde de yüklenebiliniyormuş :))) Eh azmetmek gibisi yok.


 
Categories: .NET | C# | Code | Inceleme

C# 3.0 ile birlikte gelen yeniliklerden, otomatik özellikler ile artık kolay ve hızlı bir biçimde standart özellikler (property) tanımlayabiliyoruz.

Örneğin;

class Person
{
   public int No { get; set; }
   public string Ad { get; set; }
   public FizikselOzellik Ozellik { get; set; }
}

class FizikselOzellik
{
   public int Kilo { get; set; }
   public int Boy { get; set; }
   public string Cinsiyet { get; set; }
}

gibi. Aslında IL kodlarını incelersek, derleyicinin C# 2.0 daki gibi (arka planda bir field oluşturup, get ve set erişimcilerini otomatik kendisi yazıyor) özellik tanımladığını görebiliriz. Yeni gelen diğer bir özellik ise Nesneye Ilk Değerini verme ile ilgili. Aşağıdaki sentaks ile artık nesneleri oluştururken özelliklerine de ilk değerlerini vererek nesneyi oluşturabiliriz.


Person nesnemiz içerisinde özellik olarak FizikselOzellik isimli başka bir nesne içeriyor. Bu durumda da aşağıdaki sentaks ile Person nesnemize ilk değerini verebiliriz.,

Person p = new Person {
               
Ad="oguz",No=169,
               Ozellik = new FizikselOzellik{Kilo=120,Boy=173,Cinsiyet="E"}
};

Görüldüğü gibi C# 3.0 ile gelen yenilikleri dili kullanmayı daha hızlı, zevkli ve kolay bir hale getiriyor ;)

 
Categories: C# | Code

Bazen bir aspx sayfasının çıktısı üzerinde işlemler yapmak isteyebilirisiniz. Örneğin sayfadaki yasaklı kelimelerin - genelde forumlarda ihtiyaç duyulur :)  - düzenlenmesi, ya da bazı bilindik kelimeler üzerinde işlem yapmak isteyebiliriz. Mesela ben sayfamda BT Akademi ve oğuz kelimelerine rastladığımda ilgili kelimelerin yerine sanki linki verilmiş gibi yer almasını isteyebilirim. Bu durumda yapmamız gereken çıktının - Response - Filter özelliğinden yararlanmak. Filter özelliğini - property- incelediğimizde aslında bunun bir Stream nesnesi olduğunu görürüz. Bu durumda yapmamız gereken görüntülenmesini istediğimiz çıktıyı kendimiz oluşturmak. Bunu da kendi Filter - aslında Stream'dan türemiş bir class oluşturmak - nesnemizi oluşturup Response.Filter özelliğine bu kendi nesnemizi vermekten ibaret.

Stream sınıfı abstract bir class olduğundan abstract - özet kelimesini pek sevmesem de Türkçe'de başka kelime anlamını tam veremiyor- olarak bildirilmiş metodlarını kendi sınıfımızda uygulamamız - implement - gerekiyor. Bunları ekteki dosyadan inceleyebilirsiniz. Asıl üzerinde durulması gereken konu ise bu oluşturduğumuz sınıfın Write(...) metodu. Bu metod içinde sayfamızda görünmesini istediğimiz çıktıyı kendimizin oluşturması. Örneğimizi incelersek

class AFilter:Stream
{

     Stream _originalStream = null;

     public AFilter(Stream ResponseFilter)
     {
         _originalStream = ResponseFilter;
     }

     ...........

     ...........

     public override void Write(byte[] buffer, int offset, int count)
     {
         string text = Encoding.UTF8.GetString(buffer);

         //Regex de kullanılabilir...
         text = text.Replace("oğuz", "<a href=http://www.oguzyagmur.com>oguz</a>");
         text = text.Replace("BT Akademi", "<a href=http://www.btakademi.com>BT Akademi</a>");

         // istenilen ek işlemler yapılabilir.
         text = text.Replace("\r\n", "");

         //eklemeler yapılabilir cıktıya...
         text += "<br>tüm hakkı saklı falan değildir. tepe tepe kullanın";
 
         buffer = Encoding.UTF8.GetBytes(text);
        _originalStream.Write(buffer, 0, buffer.Length);
     }
}

Write metodunda sayfaya çıktı gönderilmeden önce çıktıyı alıp üzerinden işlemler yapıp daha sonra çıktıyı sayfaya gönderiyorum. Bu sınıf oluşturdukdan sonra yapmamız gereken sayfanın OnPreInit metodunda hazırlamış olduğumuz bu filitrenin sayfa çıktısı üzerine uygulanmasını sağlamak.

protected override void OnPreInit(EventArgs e)
{
    Response.Filter = new AFilter(Response.Filter);
}

Bu durumda sitedeki her sayfa için bu işlemi tekrarlamak olacaktır ki çok da iyi bir yöntem değil. Belki MyCustomPage isimli Page den türemiş olan bir sınıf oluşturup tüm sayfalarımızı bu - MyCustomPage - sayfadan türeterek bir nevi çözüm geliştirsek de  -sizin çok daha iyi fikriniz olabilir - size önerim bu işi üstlenecek bir HttpModule hazırlamanız olacaktır.

Burda da ilk akla gelen soru hazırlamış olduğum bu filitreyi HttpModule de hangi event'te sayfanın çıktısına uygulamak. msdn'i biraz kurcaladığımda sayfanın çıktısı üzerine filitre ReleaseRequestState eventi sırasında uygulandığını öğrendim. Bu durumda aşağıdaki kısacık kod ile sitemizdeki tüm sayfalar üzerinde hazırladığımız bu filitreyi etkin kılabiliriz.

public class HrefFilter : IHttpModule
{

     public void Dispose()
     {
     }

     public void Init(HttpApplication context)
     {
         context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
     }

     void context_ReleaseRequestState(object sender, EventArgs e)
     {
         if (HttpContext.Current.Response.ContentType == "text/html")
         {
              HttpContext.Current.Response.Filter = new AFilter(HttpContext.Current.Response.Filter);
         }
     }
}


filter_dosyalar.rar (24.57 KB)
 
Categories: Asp.net