Geri git   CurcunaForum.Org > Webmaster - Grafik - Tasarım > Delphi , Visual basic , C , C++
Kayıt ol Yardım Topluluk

Delphi , Visual basic , C , C++ Delphi , visual basic.

 
 
LinkBack Seçenekler Stil
Prev önceki Mesaj   sonraki Mesaj Next
Alt 06-09-2008   #1
Profil
Üye
 
Kerem388 - ait Kullanıcı Resmi (Avatar)
 
Üyelik tarihi: Dec 2007
Bulunduğu yer: oras hakında çesitli söylentiler var karar veremedik
Yaş: 37
Mesajlar: 938
Üye No: 10499

Seviye: 27 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
Canlılık: 0 / 656
Çekicilik: 312 / 33170
Tecrübe: 25

Teşekkür

Teşekkürler: 0
0 Mesajina 0 Tesekkür Aldi
Rep
Rep Puanı : 1047
Rep Gücü : 28
İtibar :
Kerem388 has much to be proud ofKerem388 has much to be proud ofKerem388 has much to be proud ofKerem388 has much to be proud ofKerem388 has much to be proud ofKerem388 has much to be proud ofKerem388 has much to be proud of
97 CodeDom,AppDomain ve Plugin Tabanlı Prog.

Bu makalemde CodeDom sınıfını kullanarak çalışma zamanında kod derleme, AppDomain sınıfı ve Application Domain yönetimi son olarak plug in tabanlı programlama konularına değineceğim.

Yaygın olarak kullanılan uygulamalardaki genel sorun yazılımın özelleştirme olanaklarının, esnekliğinin, uyarlanabilirliğinin yetersiz olmasıdır.Bu özellikler ve nitelikler sektöre hitab eden yazılımların ön plana çıkmalarındaki en önemli kriterlerdir.
Hepimiz geliştirdiğimiz uygulamaların uyarlama bölümünde bu tür sıkıntıları yaşamışızdır.Bazen konu o kadar geniştir ki, yazılımın belirli bölümlerinde kontrolün kullanıcıda olması gerekir veya sizin kullanıcının taleplerine çok kısa sürede cevap vermeniz gerekebilir.Bu tür durumlarda plug-in tabanlı uygulamalar geliştirmemiz gerekir.

Plug in tabanlı programlama konusuna girmeden önce uzun süredir ilgimi çeken diğer bir konuya değinmek istiyorum.

Çalışma zamanında .net kodu oluşturmak/derlemek.
.Net ile uyumlu dilleri kullanarak çalışma zamanında kod oluşturma veya derleme yapma imkanımız mevcuttur.İlk bakışta aklınıza -"bu tür bir özelliği nerde kullanabiliriz?" sorusu gelebilir.Birkaç örnek vermek gerekirsekendi ide nizi geliştirebilir veya çalışma zamanında yazdığınız kodu derleyip, yazılımda herhangi bir güncelleme yapmadan uygulamanızın içinde kullanabilirsiniz..Net ile çalışma zamanında kod oluşturmak için System.CodeDom sınıfını, derlemek için kullandığımız dile ait referans sınıfını kullanırız (c# için Microsoft.CSharp).

System.CodeDom isimalanı
Bu isimalanı bize .Net dili oluşturmak için gerekli sınıfları sunar..Net dilinin yapısı tam olarak bu sınıf altında özetlenmiştir diyebiliriz.Birkaç örnek vermemiz gerekirse;

Click the image to open in full size.




Sınıf ismi
Açıklama

System.CodeDom.CodeNamespace
namespace tanımlamamızı sağlar.

System.CodeDom.CodeComment
kod yorumu tanımlamamızı sağlar.

System.CodeDom.CodeTypeDecleration
sınıf yapı arayüz gibi nesnelere tür atamamızı sağlar.

System.CodeDom.CodeEntryPointMethod
bir assembly nin giriş metodunu belitmemizi sağlar

System.CodeDom.CodeTypeReferenceExpression
referans tür belirtmemizi sağlar

System.CodeDom.CodeMethodInvokeExpression
metod çalıştırmamızı sağlar.

System.CodeDom.CodeCompileUnit
CodeDom sınıflarını içerir.
CodeCompileUnit sınıfı
.Net dillerinde kodun belli bir etki alanı mevcuttur.Yazdığımız kod bir üye ye aittir bu üye bir sınıfa, seçimli olarak sınıf da bir isimalanına.Kod yazarken ilk olarak isimalanı sonra sınıf ardından üyeleri oluşturur gerekli kodları üyelere yazarız.Özetlemek gerekirse CodeDom isimalanındaki sınıfları kullanarak kod oluştururken aynı yöntemi uygulayacağız.CodeDom isimalanındaki bütün sınıflar bir ağaç yapısındadır ve en tepedeki sınıf CodeCompileUnit sınıfıdır.Kısaca bu sınıf .Net kod parçalarını içerir.
Bu yapı kod grafiği olarak isimlendirilmektedir.

.Net kodunun çalışma zamanında oluşturulması
Kod oluşturmak veya derlemek için üreteceğimiz veya derleme yapacağımız kodun dilini destekleyen sınıfları kullanırız.
c# dili için bu Microsoft.CSharp isimalanı altındaki CSharpCodeProvider sınıfı,
VB dili için Microsoft.VisualBasic isimalanı altındaki VBCodeProvider sınıfıdır.
Bu sınıfların CompileAssemblyFromDom CompileAssemblyFromFile veya CompileAssemblyFromSource metodlarını kullanırız.




Metod ismi
Açıklama

CompileAssemblyFromDom
Kod grafiği yani CodeDom nesneleriyle derleme yapılır

CompileAssemblyFromFile
Kod bir dosyadan okunarak derleme yapılır

CompileAssemblyFromSource
Metoda kod parametre olarak gönderilerek derleme yapılır.
HelloWorld örneği
CodeDom isimalanındaki sınıfları kullanarak HelloWorld kodu üretecek bir örnek yapalım.




HelloWorld.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using Microsoft.CSharp;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// CompileUnit nesnesi yaratılıyor.
CodeCompileUnit compileUnit = new CodeCompileUnit();

// Acme ismiyle bir CodeNameSpace nesnesi yaratılıyor.
CodeNamespace samples = new CodeNamespace("Acme");
// compileUnit nesnesine ekleniyor.
compileUnit.Namespaces.Add(samples);

// System isimalanı ekleniyor.
samples.Imports.Add(new CodeNamespaceImport("System"));

// Class1 ismiyle CodeTypeDecleration nesnesi yaratılıyor
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
// compileUnit nesnesine ekleniyor.
samples.Types.Add(class1);

// programın giriş noktasını belirlemek için CodeEntryPointMethod nesnesi yaratılıyor
CodeEntryPointMethod start = new CodeEntryPointMethod();

// System.Console sınıfı için tanımlamalar yapılıyor.
CodeTypeReferenceExpression csSystemConsoleType = new CodeTypeReferenceExpression("System.Console");

// Console.WriteLine satırı yaratılıyor.
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
csSystemConsoleType, "WriteLine",
new CodePrimitiveExpression("Hello World!"));

// WriteLine satırı programın giriş noktası olan metoda ekleniyor.
start.Statements.Add(cs1);

// İkinci WriteLine satırı ekleniyor.
CodeMethodInvokeExpression cs2 = new CodeMethodInvokeExpression(
csSystemConsoleType, "WriteLine",
new CodePrimitiveExpression("Press the Enter key to continue."));

// WriteLine satırı programın giriş noktası olan metoda ekleniyor.
start.Statements.Add(cs2);

// System.Console.ReadLine komutu yaratılıyor.
CodeMethodInvokeExpression csReadLine = new CodeMethodInvokeExpression(
csSystemConsoleType, "ReadLine");

// ReadLine satırı programın giriş noktası olan metoda ekleniyor.
start.Statements.Add(csReadLine);

// Programın giriş noktası olan metod sınıf üyelerine ekleniyor.
class1.Members.Add(start);

// Kodun oluşturulması için gerekli nesneler yaratılıyor.
Stream str = File.Open("c:\\\\kod.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(str);

// C# kodumuzu oluşturacak CSharpCodeProvider ve ICodeGenerator nesneleri yaratılıyor.
CSharpCodeProvider csProvider = new CSharpCodeProvider();
ICodeGenerator cg = csProvider.CreateGenerator(sw);

// compileUnit nesnesi içinde bulunan kod dosyaya aktarılıyor.
cg.GenerateCodeFromCompileUnit(compileUnit, sw, new CodeGeneratorOptions());

// İşi biten nesneler kapatılıyor.
sw.Close();
str.Close();
}
}
}
Örneğimizi çalıştırdığımızda bize C:\\kod.txt dosyasını oluşturacaktır.




kod.txt

//----------------------------------------------------------------
//
// This code was generated by a tool.
// Runtime Version:2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//
//-----------------------------------------------------------------

namespace Acme {
using System;


public class Class1 {

public static void Main() {
System.Console.WriteLine("Hello World!");
System.Console.WriteLine("Press the Enter key to continue.");
System.Console.ReadLine();
}
}
}

Dikkat ederseniz CodeDom sınıfını açıklarken c# diline bağımlı kalmadan, .Net dillerinin oluşturulup derlenebileceğinden bahsettim.HelloWorld.cs örneğindeki kod ile CodeDom yapısını destekleyen bütün dillerde kod oluşturabilir, derleyebiliriz.İsterseniz aynı örneği sadece iki satırını değiştirerek vb.net kodu üretmesi için uyarlayalım.




HelloWorld.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using Microsoft.VisualBasic;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
......
* ......
* ......

// Vb kodumuzu oluşturacak VBCodeProvider ve ICodeGenerator nesneleri yaratılıyor.
VBCodeProvider csProvider = new VBCodeProvider();
ICodeGenerator cg = csProvider.CreateGenerator(sw);

// compileUnit nesnesi içinde bulunan kod dosyaya aktarılıyor.
cg.GenerateCodeFromCompileUnit(compileUnit, sw, new CodeGeneratorOptions());

// İşi biten nesneler kapatılıyor.
sw.Close();
str.Close();
}
}
}
Örneğimizi çalıştırdığımızda bize C:\\kod.txt dosyasını vb.net dilinde oluşturacaktır.




kod.txt

’------------------------------------------------------------------------------
’ <auto-generated>
’ This code was generated by a tool.
’ Runtime Version:2.0.50727.42

’ Changes to this file may cause incorrect behavior and will be lost if
’ the code is regenerated.
’ </auto-generated>
’------------------------------------------------------------------------------

Option Strict Off
Option Explicit On

Imports System

Namespace Acme

Public Class Class1

Public Shared Sub Main()
System.Console.WriteLine("Hello World!")
System.Console.WriteLine("Press the Enter key to continue.")
System.Console.ReadLine
End Sub
End Class
End Namespace
CodeDom isimalanı gördüğünüz gibi dilden bağımsız kodun temsil edilmesini sağlar.

.Net kodunun çalışma zamanında derlenmesi
.Net kodu derleme için derleyeceğimiz dilin ilgili sınıflarını kullanacağız.Kod oluşturma işleminden farklı olarak derleme parametrelerini belirlemek için CompilerParameters sınıfı kullanmamız gerekmektedir.Sonuç olarak bu işlemi csc.exe yi çalıştırmakla aynı sayabilirsiniz.csc.exe derleme programının aldığı parametreleri burda CompilerParameters sınıfı ile temsil ediyoruz.C# kodu derlemek için CSharpCodeProvider sınıfını kullanacağız.




HelloWorld.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using Microsoft.CSharp;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
......
* ......
* ......

// C# kodumuzu oluşturacak CSharpCodeProvider ve ICodeGenerator nesneleri yaratılıyor.
CSharpCodeProvider csProvider = new CSharpCodeProvider();
ICodeGenerator cg = csProvider.CreateGenerator(sw);

// compileUnit nesnesi içinde bulunan kod dosyaya aktarılıyor.
cg.GenerateCodeFromCompileUnit(compileUnit, sw, new CodeGeneratorOptions());

// İşi biten nesneler kapatılıyor.
sw.Close();
str.Close();

* *
CSharpCodeProvider provider = new CSharpCodeProvider();
* // derleme parametreleri için CompilerParameters türünden bir nesne oluşturuyoruz.
CompilerParameters cp = new CompilerParameters();
* // Projenin System.dll i referans gösterdiğini belirtiyoruz.(opsiyonel)
cp.ReferencedAssemblies.Add("System.dll");
* // çalıştırılabilir bir assembly dosyası derlenmesi için özellik atanıyor.
cp.GenerateExecutable = true;
// derlenecek assembly dosyasını belirtiyoruz.
cp.OutputAssembly = "c:\\\\HelloWorld.exe";
* // kodun belleğe derlenmemesi için bu özelliğe false değerini atıyoruz.
cp.GenerateInMemory = false;
* // kod derleniyor.
CompilerResults cr = provider.CompileAssemblyFromFile(cp, new string[] {"C:\\\\kod.txt" });
* // eğer hatalar mevcutsa ekrana basılıyor.
if (cr.Errors.Count > 0)
{
Console.WriteLine("Derlemede Hata(lar) oluştu...");
foreach (CompilerError ce in cr.Errors)
{
Console.WriteLine(ce.ToString());
}
}

}
}
}

ve dosyamız derlenmiş durumdadır

Click the image to open in full size.
__________________

Click the image to open in full size.
Kerem388 is offline Kerem388 isimli üyenin yazdığı bu Mesajı değerlendirin.   Alıntı ile Cevapla
 

Etiketler
appdomain, codedom, plugin, prog, tabanli


Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık


Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 17:36.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.