1- Giriş
Bir önceki yazımda “C# Programlarında Lua Scriptleri Kullanmak – 1” çok temel biçimde Lua’nın C#’dan kullanımı, C#’dan Lua betiğine parametreler gönderme ve Lua betiğinden C# koduna erişimle ilgili örnekler gösterdim. Bu yazımda ise çok daha işe yarar biçimde bir C# Windows Form yazılımının Lua betikleri ile entegre edilip nasıl parametrik/dinamik hale getirilebileceğini göstereceğim.

2- C# Kodları
C# kodumuz aşağıdaki gibidir:

// Lua scriptleme nesnesi oluştur
Lua script = new Lua();
 
// CLR'i Yükleyelim
script.LoadCLRPackage();

// Formu Lua'ya belirtelim
script["formNesnesi"] = this;

// Buton basılınca çağırılacak metodumuzu tanımlayalım
MethodInfo testMetodu = this.GetType().GetMethod("_testMetodu", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance, null, new Type[] {typeof(int),typeof(int)}, null);

// Metodu Lua'ya kaydedelim
script.RegisterFunction("testMetodu", this, testMetodu);

// Dosyadan Lua scriptini çalıştır
script.DoFile("test5.lua");

“LoadCLRPackage()” ile CLR paketini script alt yapısına yüklüyoruz, bu paket .Net framework’üne Lua’nın erişmesi için gerekmektedir.

“MethodInfo” ile başlayan satırda temel olarak C# metodumuzu Lua’ya bağlayabilmek için gereken ön çalışma olan metod göstergecini alma işlemini yapıyoruz. Temel olarak burada “_testMetodu” adında ve 2 adet int tipinde parametresi olan bir metodun göstergeci/pointerı alıyoruz.

Akabinde altındaki satırdaki “RegisterFunction” metoduyla metodumuzu Lua scriptimize ekliyoruz. Bundan sonra aslında bu metodu Lua’dan doğrudan çağırabileceğiz.

Diğer kodlar bir önceki yazıda gördüğümüz kodlar. Methodumuzu da bir yerde tanımlamayı unutmayalım:

private void _testMetodu(int a, int b)
{
            MessageBox.Show("Merhaba! Toplam="+(a+b).ToString());
}

Bu C# metodu ile verilen 2 integer değeri toplayıp MessageBox içerisinde gösteriyoruz.

3- Lua Betiği
Lua betiğimiz aşağıdaki şekildedir, “test5.lua” olarak kaydedelim.

-- Gerekli bileşenleri yükle
import("System.Windows.Forms")
import("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
import("System.Drawing")
Forms = CLRPackage("System.Windows.Forms", "System.Windows.Forms")
Drawing = CLRPackage("System.Drawing", "System.Drawing")

-- .Net Nesne Tanımlarını LUA'ya Çekelim
Form=Forms.Form
Button=Forms.Button
TextBox=Forms.TextBox
Label=Forms.Label
Point=Drawing.Point
Size=Drawing.Size

-- Button Basıldığında Çağırılacak Fonksiyon
function yeniButton_Click(sender,data)
	-- C# sınıfımızdaki metodu çağıralım
	testMetodu(3,5)
end

-- Button oluşturalım
yeniButton=Button()
yeniButton.Text = "Button Örneği"
yeniButton.Location = Point(220, 0)
yeniButton.Name = "yeniButton"
yeniButton.Size = Size(100, 20)
handler=yeniButton.MouseUp:Add(yeniButton_Click)

-- Textbox oluşturalım
yeniTextBox=TextBox()
yeniTextBox.Text = "TextBox Örneği"
yeniTextBox.Location = Point(110, 0)
yeniTextBox.Name = "yeniTextBox"
yeniTextBox.Size = Size(100, 20)

-- Label oluşturalım
yeniLabel=Label()
yeniLabel.Text = "Label Örneği"
yeniLabel.Location = Point(0, 0)
yeniLabel.Name = "yeniLabel"
yeniLabel.Size = Size(100, 20)

-- Nesneleri formumuza ekleyelim
formNesnesi.Controls:Add(yeniButton) 
formNesnesi.Controls:Add(yeniTextBox) 
formNesnesi.Controls:Add(yeniLabel)

Lua betiğinde çok özel bir kod yok, genel olarak standart Lua kodlarından oluşuyor. “formNesnesi” bizim C# kodumuzdan Lua scriptine bildirdiğimiz Form nesnemiz. Lua içerisinden Button/Label/TextBox oluşturup Form nesnemize ekliyoruz. Button nesnemizi oluştururken ek olarak “yeniButton_Click” Lua metodunu fareye tıklama olayına bağlıyoruz. C# kodumuzdan bağladığımız “testMetodu” metodunu da Lua betiğimizden normal bir biçimde çağırıyoruz.

4- Sonuç
Bu yazıda C# ve Lua’yı oldukça yakından entegre etmenin yöntemlerini gördük. Umarım işinize yarar, iyi kodlamalar.