Anasayfa / Yazılım / C# / Reflection – Yansıma

Reflection – Yansıma

Reflection sınıfı (yansıma) program çalışma esnasında assembly içindeki yani programın tamamının içindeki oluşturulmuş olan class, method gibi tüm türler hakkında bilgi almamızı sağlayan sınıfıtır. .NET?in çok güçlü bir özelliğidir. Yaptığı iş ile hangi türü sorgulamak istiyorsa bu türe ait olan metadata bilgileri çekilir, tüm bu işlem sürecinde System.Reflection kütüphanesini kullanır ve bu üzerinde çalışılan türü System.Type nesnesi ile temsil eder. Type sınıfı aslında soyut bir sınıftır MemberInfo sınıfından türemiştir ve bir çok metota sahiptir. Tür üyeleri hakkında bilgi edinilebilir, tür üyeleri çağırılabilir, Assembly?den tür yüklenebilir, nesne oluşturulabilir.

Assembly kavramı, Assembly sınıfı nedir buna değinelim. .NET ortamında yazılan programlar derlenirken programa ait olan tüm elemanlar, metotlar, sınıflar, değişkenler metadata dediğimiz bilgiler ile birlikte derlenmektedir. Kaynak kodların ve metadata bilgilerinin bulunduğu .NET birimini assembly olarak adlandırabiliriz. Yani aslında derlenmiş her birim assembly adını alır. Bunlar exe ve dll dosyalarıdır.

Reflection ile bir exe’nin ya da bir dll dosyasının içeriğindeki kodları görüntüleyebiliriz. Tabii Dotfuscator ile üzerinde rasgele değişimler vs yapılmadı ise. Bu toolu (VS Tools’da bulabilirsiniz) yazılan programın kodlarını gelişigüzel dışarıdan saklamak amacı ile kullanabilirsiniz. Şu anda konumuz bu olmadığı için bunun ayrıntılarına girmiyorum.

Assembly sınıfı demiştik, bir projede birden fazla assembly bulunabilir. Bütün bu assembly’leri elde etmek için AppDomain sınıfı kullanılır.

AppDomain sınıfının GetAssemblies() statik metodu bir programa ait olan bütün assembly’leri assembly türünde bir diziye aktarır.

Assembly sınıfının GetExecutingAssembly() statik metodu ile o an çalışan programa ait assembly bilgisine ulaşılabilir.

Assembly sınıfının LoadFrom()metodu ile bir assembly dosyasının yolu belirtilerek Assembly sınıfı nesneleri elde edilebilir.

Bu kadar teorik bilginin ardından biz yine Type sınıfına ve Reflection ile olan ilişkisine dönelim.

MemberInfo Sınıfı : Bir türdeki bütün elemanları temsil etmek için kullanılır, bir tür hakkında bilgi alınabilir. Örnek olarak aşağıdaki programda String türünün tüm metotlarını bir listboxa aktarıyorum.

MethodInfo Sınıfı : Bir türdeki metotları temsil eder aynı zamanda bunları uygulama içinde çağırma imkanı da sunar.

Bir örnekde bunun için yaparsak;

ParameterInfo Sınıfı : Bir metottaki parametreleri görebiliriz.
ConstructorInfo Sınıfı : Bir türün yapıcı metotları hakkında bilgi verir.
PropertyInfo Sınıfı : Bir türün özellikleri hakkında bilgi verir.
FieldInfo Sınıfı : Bir türün değişkenleri hakkında bilgi verir.
EventInfo Sınıfı : Bir türün olayları hakkında bilgi verir.

Son sınıflarla alakalı örnek sunmadım, zaten üstteki örnekler baz alınarak rahatlıkla sizde yapabilirsiniz. Örneğin kendimize ait bir class içinde oluşturulan özellikleri, değişkenleri, eventleri, metotları da görebiliriz.

Tüm bunlarda gelmek istediğim nokta aslında şu, özellikle geniş çaplı projelerde örneğin sizin yapmış olduğunuz bir asıl uygulama olmuş olsun. Ve bu uygulama geliştirime açık bir uygulama olmuş olsun. Bu uygulamayı geliştirebilmek için de herkese fırsat verdiğinizi düşünün. Farklı farklı kişiler uygulamanız için eklentiler geliştirebilirler, ki biz bunlara plugin diyoruz biliyorsunuz. Bu plugin içinoluşturulan dll yapısını görüntülemek, hangi metotlar kullanılmış görmek, hangi değişkenler var görmek vs vs gibi işlemler için işte Reflection oldukça önemlidir.

Ayrıca şunu da belirteyim yeri gelmişken, reflection için hali hazırda uygulamalarda var. .NET Reflector olarak aşağıdaki siteden programı download edebilirsiniz.
.NET REFLECTOR

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir