Makale Özeti

Bu makalede kendine özgü tarzı olan kullanıcıları memnun edecek bir yapıyı kurmaya çalışacağız. Değişiklik isteyen kullanıcıya, istediği değişikliği buyrun siz kodlayın diyebileceğiz. :) Bu sayede isterse komut düğmesine basıldığında dahi ne yapılacağını kendi kodlayabilecek.

Makale

Kodcuk (Scripting)

Derleme SonrasInda ProgramI GelİŞtİrebİlme
-Kodcuk (Script) yaklaŞIMI-

Özellikle büyük uygulamalar geliştirirken, kullanıcıya göre değiştirilebilir kısımların desteklenmesi önemlidir. Değiştirilebilirlik, renklerin seçilebilmesinden menülerin yerlerinin değiştirilmesine kadar herşey olabilir. Bu makalede kendine özgü tarzı olan kullanıcıları memnun edecek bir yapıyı kurmaya çalışacağız. Değişiklik isteyen kullanıcıya, istediği değişikliği buyrun siz kodlayın diyebileceğiz. :) Bu sayede isterse komut düğmesine basıldığında dahi ne yapılacağını kendi kodlayabilecek.

Bu yapıyı sağlayabilmek için çalışma zamanında derleme yapılması gerekecek. Aklınıza hemen reflection (yansıma) geldi değil mi? (Gelmediyse gelsin;) Kullanıcı bizim belirlediğimiz sınır çerçevesinde isteği kodu yazacak. Biz de o kodu derleyip programa dahil edeceğiz. Tabi kullanıcının hangi alanlara müdahele edebileceğini dikkatlice belirlemeliyiz. Yoksa hesap makinesi niyetine yazdığımız program, müzik kutusuna dönüşebilir. :)

Uygulamamızın temelini sağlam kurmak üzere arayüzlerden (interfaces) yararlanacağız. Gerçekleştireceğimiz uygulamada bir tane metin kutusu ve bir tane de komut düğmesi olacak. Komut düğmesinin arkasındaki kod kullanıcı tarafından belirlenebilecek. Şimdi bu yapıyı destekleyecek arayüzümüzü oluşturalım.

Yeni bir çözüm (solution) başlatıp sınıf kütüphanesi şablonunu kullanarak yeni bir proje ekleyin. Class1.vb dosyasının adının Arayuzler.vb olarak değiştirin ve arayüzlerimizin kodlarını ekleyin.

Public Interface IKodcuk
    Sub Yapilandirma(ByVal Sunucu As ISunucu)
    Sub Islem()
End Interface 

Public Interface ISunucu
    ReadOnly Property MetinKutusu() As System.Windows.Forms.TextBox
    Sub Goster(ByVal Message As String)
End Interface

Çözüme (solution) yeni bir windows proje ekleyin. Asıl işlemlerimizi bu proje üzerinden gerçekleştireceğiz. İlk işimiz Arayuzler projesine referans eklemek olacak. Daha sonra projeye otomatik olarak oluştrulan form dışında frmKodcuk adında yeni bir windows formu daha ekleyin. Otomatik olarak oluşturulan formun adını frmAna olarak değiştirin. Kodcuk adında bir tane sınıf ve Kodcuklar.txt adında bir tane de metin dosyasını projeye ekleyin. Burada projenin önemli noktaları üzerinde duracağız. Makalenin sonunda da çalışan projeyi indirebileceğiniz bir bağlantı vereceğim.

Ana formumuzda bir tane metin kutusu, iki tane de komut düğmesi olacak. Bunlardan biri oluşturduğumuz kodcuklar.txt dosyasının içindekilerini yükleyerek kullanıcıya kodcuk yazma arabirimi sunarken, diğeri de yazılan kodu çalıştıracak. İkinci formumuz ise derleme yapan bölümümüzü oluşturacak. Yazılan kodları çalışma zamanında derleyecek ve hata olursa uyarı verecek. Kısaca basit bir kod editörü olacak. Aslında çalışma zamanında derleme yapabilmemiz için gerekli sınıflar .net framework içinde (System.CodeDom.Compiler) sunulmaktadır. Bu yüzden bize kalan sadece kodcuk.vb dosyası içinde gerekli kodları istediğimiz yapıyı kurmak üzere yazmak oluyor.

Gerekli açıklamaları kod içinde yaptığım için burada tekrar anlatmayacağım ama bir iki noktanın altını çizmek istiyorum.


1.Şekil: Anaform

Public Shared Function KodcukDerle(ByVal Kaynak As String, ByVal Referans As String, ByVal DilTipi As CodeDomProvider) As CompilerResults

        Dim derleyici As ICodeCompiler = DilTipi.CreateCompiler()
        Dim parametreler As New CompilerParameters
        Dim sonuclar As CompilerResults

       
Parametrelerin ayarlanması
        With parametreler
            .GenerateExecutable = False
            .GenerateInMemory = True
            .IncludeDebugInformation = False
            If Not Referans Is Nothing AndAlso Referans.Length <> 0 Then .ReferencedAssemblies.Add(Referans)
            .ReferencedAssemblies.Add("System.Windows.Forms.dll")
            .ReferencedAssemblies.Add("System.dll")
        End With  

        Derleme
        sonuclar = derleyici.CompileAssemblyFromSource(parametreler, Kaynak)
        Return sonuclar
    End Function

Parametrelerin ayarlanması kısmına bakarsanız, çalıştırılabilir bir dosya istemediğimizden .GenerateExecutable özelliğini False olarak ayarladık. Yine hata ayıklama istemediğimiz için .IncludeDebugInformation özelliğini de False olarak ayarladık. Metin kutularıyla çalışabilmek için (Anaformun metin kutusuyla) System.Windows.Forms.dll dosyasını (tam olarak assembly) da ekledik. Herhangi bir dosya olarak kaydetmek istemediğimizden .GenerateInMemory özelliğini True olarak ayarladık.

Dikkat edilmesi gereken diğer bir nokta yine Kodcuk.vb dosyası içindeki şu bölümdür;

    Public Shared Function ArayuzBul(ByVal DLL As Reflection.Assembly, ByVal ArayuzAdi As String) As Object
        Dim t As Type
        Verilen arayüzü destekleten tipi bulmak için kullanılan döngü
        For Each t In DLL.GetTypes()
            If Not (t.GetInterface(ArayuzAdi, True) Is Nothing) Then
                Return DLL.CreateInstance(t.FullName)
            End If
        Next
        Return Nothing
    End Function

Burada Reflection (Yansıma) kullanılarak assembly içinden yeni bir nesne oluşturuluyor.

Böylelikle bu konu hakkında anlatacaklarımı bitirdim. Programı çalıştırdığınızda varsayılan olarak metinkutusunu gizleyip gösteren bir yordamın yazılı olduğu göreceksiniz. Bu kodları (örneğin toplama yapacak şekilde) düzenleyip çalışmasını kontrol edin. Bir sonraki yazıda görüşmek üzere. Yorumlarınızı bekliyorum.

Çalışır durumdaki projeyi indirmek için tıklayın.

Kaynak: http://divil.co.uk

Kâsım GÜLCAN
SQLNedir?com