{"id":332,"date":"2018-06-14T00:45:09","date_gmt":"2018-06-13T21:45:09","guid":{"rendered":"http:\/\/www.scozturk.com\/?p=332"},"modified":"2025-08-29T10:45:03","modified_gmt":"2025-08-29T10:45:03","slug":"c-programlarinda-lua-scriptleri-kullanmak","status":"publish","type":"post","link":"http:\/\/18.193.70.38\/?p=332&lang=tr","title":{"rendered":"C# Programlar\u0131nda Lua Scriptleri Kullanmak &#8211; 1"},"content":{"rendered":"<p><em><strong>1- Giri\u015f<\/strong><\/em><br \/>\nYaz\u0131l\u0131m geli\u015ftirirken s\u0131kl\u0131kla kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z bir durum \u015fudur:<\/p>\n<ol>\n<li>M\u00fc\u015fterinizin bir uygulama ile ilgili baz\u0131 talepleri olur.<\/li>\n<li>Siz bu talepleri al\u0131r, inceler ve bir SRS belgesi olu\u015fturursunuz.<\/li>\n<li>Akabinde de m\u00fc\u015fterinizle anla\u015f\u0131p \u00e7al\u0131\u015fmalara ba\u015flars\u0131n\u0131z.<\/li>\n<li>Siz yaz\u0131l\u0131m\u0131 geli\u015ftirirsiniz, m\u00fc\u015fterinizin sistemlerine kurars\u0131n\u0131z ve m\u00fc\u015fteriniz \u00e7ok be\u011fenir.<\/li>\n<li>3 ay sonra m\u00fc\u015fteriniz &#8220;program ak\u0131\u015f\u0131 \u015f\u00f6yle de\u011fil de b\u00f6yle olsa&#8221; gibi bir talepte bulunur.<\/li>\n<li>Siz de kodunuzu tekrardan a\u00e7\u0131p, d\u00fczenleyip, derleyip, kurulumu tekrarlars\u0131n\u0131z.<\/li>\n<\/ol>\n<p>Yukar\u0131daki senaryo yaz\u0131l\u0131m geli\u015ftiriciler i\u00e7in olduk\u00e7a zorludur. \u00c7\u00fcnk\u00fc bir\u00e7ok m\u00fc\u015fterinin farkl\u0131 \u00fcr\u00fcn\u00fc ile bir yandan u\u011fra\u015f\u0131rken, bir yandan da eski yaz\u0131l\u0131mlar\u0131n ak\u0131\u015f veya basit g\u00fcncellemeleri ile ilgilenmek gerekmektedir.<\/p>\n<p>Yaz\u0131l\u0131mlar da genellikle statik oldu\u011fundan, yaz\u0131l\u0131m\u0131n davran\u0131\u015f\u0131n\u0131n de\u011fi\u015febilmesi i\u00e7in tekrardan kodlanmas\u0131, derlenmesi ve m\u00fc\u015fteri sistemlerine kurulmas\u0131 gerekmektedir.<\/p>\n<p>\u00d6zellikle \u00e7ok m\u00fc\u015fteriniz ve \u00e7ok farkl\u0131 yaz\u0131l\u0131mlar\u0131n\u0131z varsa bu durum s\u00fcrd\u00fcr\u00fclebilir bir halden \u00e7\u0131kacakt\u0131r. <\/p>\n<p>\u00c7\u00f6z\u00fcm\u00fc var m\u0131d\u0131r? Bir\u00e7ok \u00e7\u00f6z\u00fcm\u00fc var, fakat alternatif bir \u00e7\u00f6z\u00fcm Lua gibi bir script dilini entegre ederek yaz\u0131l\u0131m\u0131n\u0131z\u0131 geli\u015ftirmek olacakt\u0131r. Lua gibi bir script dilini C# program\u0131n\u0131zda kullanman\u0131n avantajlar\u0131 \u015fu \u015fekildedir:<\/p>\n<ul>\n<li>Daha deneyimsiz yaz\u0131l\u0131mc\u0131lar sadece basit Lua scriptlerini editleyerek yaz\u0131l\u0131m\u0131 kullanabilir<\/li>\n<li>\u0130\u015f Ak\u0131\u015f\u0131 ile programlama alt yap\u0131s\u0131 birbirinden tamamen ayr\u0131larak genelde de\u011fi\u015fecek k\u0131s\u0131m olaran i\u015f ak\u0131\u015f\u0131 tamamen scriptler arac\u0131l\u0131\u011f\u0131yla dinamik olarak yap\u0131labilir<\/li>\n<li>Scriptler program taraf\u0131ndan uzaktan g\u00fcncellenebilir ve bunun i\u00e7in basit bir dosya indirme \u00f6zelli\u011fi yeterlidir<\/li>\n<\/ul>\n<p>Dezavantajlar, yada daha do\u011frusu ek zorluklar, \u015funlard\u0131r:<\/p>\n<ul>\n<li>Yaz\u0131l\u0131m geli\u015ftirilirken ba\u015fta biraz daha fazla d\u00fc\u015f\u00fcn\u00fcp iyi bir mimari tasarlamak gerekir<\/li>\n<li>C# bile\u015fenleri daha genel ge\u00e7er ve &#8220;motor&#8221; \u015feklinde tasarlan\u0131r<\/li>\n<li>Baz\u0131 basit &#8220;d\u00fc\u011fmeye bas\u0131l\u0131nca \u015fu metodu \u00e7al\u0131\u015ft\u0131r&#8221; gibi C# kodlar\u0131 fazlaca karma\u015f\u0131kla\u015f\u0131r<\/li>\n<\/ul>\n<p>Fakat bir yaz\u0131l\u0131m \u00fcr\u00fcn\u00fcn\u00fcn ya\u015fam d\u00f6ng\u00fcs\u00fc d\u00fc\u015f\u00fcn\u00fcld\u00fc\u011f\u00fcnde, ba\u015fta bu yat\u0131r\u0131m\u0131 yapmak, sonradan yapmaman\u0131n bedelini \u00f6demekten genelde daha mant\u0131kl\u0131 olabilir, duruma g\u00f6re de\u011fi\u015fir tabii ki.<\/p>\n<p><em><strong>2- Kurulum<\/strong><\/em><br \/>\nBu yaz\u0131daki ad\u0131mlar\u0131 takip edebilmek i\u00e7in:<\/p>\n<ol>\n<li>Visual Studio C# Geli\u015ftirme Ortam\u0131<\/li>\n<li>NLua Nuget Paketi<\/li>\n<\/ol>\n<p>bile\u015fenlerini kurman\u0131z gerekmektedir. Akabinde standart bir C# Windows Form projesi a\u00e7\u0131p ekrana birka\u00e7 <em>Button<\/em> ve <em>Label<\/em> ekleyebilirsiniz.<\/p>\n<p><em><strong>3- Kullan\u0131m<\/strong><\/em><br \/>\nEn basit \u00f6rnek \u015fu \u015fekilde olabilir:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/ Lua scriptleme nesnesi olu\u015ftur\nLua script = new Lua();\n\n\/\/ X ve Y ad\u0131nda 2 de\u011fi\u015fken script nesnesinde tan\u0131mla ve textBox'lardan say\u0131sal de\u011ferleri ata\nscript&#x5B;&quot;x&quot;] = int.Parse(textBox1.Text);\nscript&#x5B;&quot;y&quot;] = int.Parse(textBox2.Text);\n\n\/\/ Hesaplamay\u0131 \u00e7al\u0131\u015ft\u0131r ve sonucu textBox'a yazd\u0131r\ntextBox3.Text = (script.DoString(&quot;return x*y&quot;)&#x5B;0] as double?).ToString();\n<\/pre>\n<p>Bu \u00f6rnekte <em>x<\/em> ve <em>y<\/em> ad\u0131nda 2 adet Lua de\u011fi\u015fkeni tan\u0131mlay\u0131p ilk de\u011ferlerini at\u0131yoruz. Sonras\u0131nda ise <em>&#8220;return x*y&#8221;<\/em> Lua scriptini \u00e7al\u0131\u015ft\u0131r\u0131p \u00e7\u0131kt\u0131s\u0131n\u0131 yazd\u0131r\u0131yoruz. <\/p>\n<p>Biraz daha karma\u015f\u0131k bir \u00f6rnek g\u00f6relim:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/ Lua scriptleme nesnesi olu\u015ftur\nLua script = new Lua();\n\n\/\/ Ger\u00e7ek bir Lua fonksiyonunu script nesnemize ekleyelim\nscript.DoString(@&quot;\n                function complexAdder(val1, val2)\n                    return val1 + val2\n                end\n&quot;);\n\n\/\/ Fonksiyonumuzu \u00e7ekelim\nvar scriptFunction = script&#x5B;&quot;complexAdder&quot;] as LuaFunction;\n\n\/\/ Fonksiyonumuzu kullanarak Lua fonksiyonunu \u00e7a\u011f\u0131ral\u0131m ve sonucu yazd\u0131ral\u0131m\ntextBox3.Text = (scriptFunction.Call(5, 777).First()).ToString();\n<\/pre>\n<p>Bu \u00f6rnekte ise ger\u00e7ek bir Lua fonksiyonunu dinamik olarak \u00e7a\u011f\u0131r\u0131p <em>5<\/em> ile <em>777<\/em>&#8216;nin nas\u0131l toplanabildi\u011fini g\u00f6r\u00fcyoruz.<\/p>\n<p>\u015eimdi daha ilgin\u00e7 \u00f6rneklere ge\u00e7iyoruz. \u00d6ncelikle &#8220;test.lua&#8221; ad\u0131nda bir yaz\u0131 dosyas\u0131 olu\u015fturup Debug klas\u00f6r\u00fcm\u00fcze koyal\u0131m. Dosyan\u0131n i\u00e7eri\u011fi \u015f\u00f6yle olabilir:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfunction complexAdder(val1, val2)\n    return val1 + val2\nend\n<\/pre>\n<p>Akabinde C# projemizde \u015fu kod blo\u011funu deneyelim:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/ Lua scriptleme nesnesi olu\u015ftur\nLua script = new Lua();\n\n\/\/ Dosyadan Lua scripti oku\nscript.DoFile(&quot;test.lua&quot;);\n\n\/\/ Script i\u00e7erisindeki fonksiyonumuzu \u00e7ekelim\nvar scriptFunction = script&#x5B;&quot;complexAdder&quot;] as LuaFunction;\n\n\/\/ Fonksiyonumuzu kullanarak Lua fonksiyonunu \u00e7a\u011f\u0131ral\u0131m ve sonucu yazd\u0131ral\u0131m\ntextBox3.Text = (scriptFunction.Call(5, 777).First()).ToString();\n<\/pre>\n<p>\u015eimdi kodumuzu derleyelim ve \u00e7al\u0131\u015ft\u0131ral\u0131m. \u00c7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda <em>5+777<\/em> i\u015fleminin yap\u0131l\u0131p <em>782<\/em> sonucunu ald\u0131\u011f\u0131m\u0131z\u0131 g\u00f6rece\u011fiz. Akabinde kodumuzu tekrar derlemeden sadece test.lua scriptimizi \u015fu \u015fekilde de\u011fi\u015ftirelim:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfunction complexAdder(val1, val2)\n    return val1 - val2\nend\n<\/pre>\n<p>Kodumuzu tekrardan \u00e7al\u0131\u015ft\u0131ral\u0131m. Sonu\u00e7 olarak \u015fimdi <em>-772<\/em> oldu\u011funu g\u00f6rece\u011fiz. Kodumuzu derlemeden, sadece scriptimizi de\u011fi\u015ftirerek dinamik bir bi\u00e7imde yaz\u0131l\u0131m\u0131m\u0131z\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftirebilmeyi ba\u015fard\u0131k. <\/p>\n<p>Biliyorum, akl\u0131n\u0131za bir\u00e7ok kullan\u0131m yeri geldi. Ama akl\u0131n\u0131za \u015fu soru da geldi: &#8220;Say\u0131larla oynamak g\u00fczel, ama ger\u00e7ek C# nesnelerini nas\u0131l scriptleyece\u011fiz?&#8221;. \u00c7ok zor de\u011fil, a\u015fa\u011f\u0131daki C# kodunu deneyelim:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/ Lua scriptleme nesnesi olu\u015ftur\nLua script = new Lua();\n\n\/\/ Dosyadan Lua scriptini \u00e7al\u0131\u015ft\u0131r ve \u00e7\u0131kt\u0131s\u0131n\u0131 ekrana yazd\u0131r\ntextBox3.Text = script.DoFile(&quot;test2.lua&quot;)&#x5B;0].ToString();&lt;\/code&gt;\n<\/pre>\n<p><em>test2.lua<\/em> scriptiniz ise \u015fu sat\u0131rlar\u0131 i\u00e7ersin:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n-- Gerekli bilesenleri yukle\nluanet.load_assembly(&quot;System&quot;)\nWebClient=luanet.import_type(&quot;System.Net.WebClient&quot;)\n\n-- Bir istemci olustur\nistemci = WebClient()\n\n-- scozturk.com i\u00e7eri\u011fini \u00e7ek ve d\u00f6nd\u00fcr\nreturn istemci:DownloadString('http:\/\/www.scozturk.com')\n<\/pre>\n<p>C# kodumuzu derleyip \u00e7al\u0131\u015ft\u0131ral\u0131m. <em>.Net WebClient<\/em> nesnesini kullanarak <em>scozturk.com<\/em>&#8216;un i\u00e7eri\u011fini al\u0131p d\u00f6nd\u00fcrebildik. <\/p>\n<p>Peki Lua scriptimizden, C# yaz\u0131l\u0131m\u0131m\u0131zdaki nesneleri nas\u0131l kontrol edebilir? \u015eu kod blo\u011funu deneyelim:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/ Bir nesne tan\u0131mlayal\u0131m\nstring degiskenim = &quot;Merhaba &quot;;\n\n\/\/ Lua scriptleme nesnesi olu\u015ftur\nLua script = new Lua();\n\n\/\/ Tan\u0131mlad\u0131\u011f\u0131m\u0131z nesneyi Lua scriptimizde global nesne olarak tan\u0131mlayal\u0131m\nscript&#x5B;&quot;globalDegisken&quot;] = degiskenim;\n\n\/\/ Dosyadan Lua scriptini \u00e7al\u0131\u015ft\u0131r\nscript.DoFile(&quot;test3.lua&quot;);\n\n\/\/ Nesnemi g\u00fcncelle\ndegiskenim = script&#x5B;&quot;globalDegisken&quot;].ToString();\n\n\/\/ Ekranda g\u00f6ster\nextBox3.Text = degiskenim;\n<\/pre>\n<p><em>test3.lua<\/em> scriptiniz de basit\u00e7e \u015fu sat\u0131r\u0131 i\u00e7ersin:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nglobalDegisken = globalDegisken..&quot;D\u00fcnya!&quot;\n<\/pre>\n<p>Kodumuzu derleyip \u00e7al\u0131\u015ft\u0131ral\u0131m, ekranda <em>&#8220;Merhaba D\u00fcnya!<\/em>&#8221; yaz\u0131s\u0131n\u0131 g\u00f6rebilece\u011fiz. <em>String<\/em> ile i\u015flem yapmay\u0131 saym\u0131yoruz, daha karma\u015f\u0131k bir nesne ile \u00f6rnek isteriz dediniz:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/ Bir nesne tan\u0131mlayal\u0131m\nWebClient internetNesnem = new WebClient();\n\n\/\/ Lua scriptleme nesnesi olu\u015ftur\nLua script = new Lua();\n\n\/\/ Tan\u0131mlad\u0131\u011f\u0131m\u0131z nesneyi Lua scriptimizde global nesne olarak tan\u0131mlayal\u0131m\nscript&#x5B;&quot;internetNesnesi&quot;] = internetNesnem;\n\n\/\/ Dosyadan Lua scriptini \u00e7al\u0131\u015ft\u0131r\nscript.DoFile(&quot;test4.lua&quot;);\n\n\/\/ Nesnemi g\u00fcncelle\ninternetNesnem = (WebClient)script&#x5B;&quot;internetNesnesi&quot;];\n\n\/\/ Scriptin kulland\u0131\u011f\u0131 nesneden cevap ba\u015fl\u0131klar\u0131n\u0131 \u00e7ek ve g\u00f6ster\ntextBox3.Text = internetNesnem.ResponseHeaders.ToString();\n<\/pre>\n<p><em>test4.lua<\/em> scriptimiz de \u015fu \u015fekilde olsun:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n-- Gerekli bilesenleri yukle\nluanet.load_assembly(&quot;System&quot;)\nWebClient=luanet.import_type(&quot;System.Net.WebClient&quot;)\n\n-- Scozturk.com i\u00e7eri\u011fini \u00e7ek ve d\u00f6nd\u00fcr\nreturn internetNesnesi:DownloadString('http:\/\/www.scozturk.com')\n<\/pre>\n<p>Bu son \u00f6rnekte ise <em>www.scozturk.com<\/em> sitesine gidip verileri \u00e7ekme i\u015fini Lua&#8217;dan yapt\u0131k. Fakat nesnemizi C#&#8217;da olu\u015fturmu\u015ftuk. Lua scripti \u00e7al\u0131\u015ft\u0131ktan sonra C#&#8217;dan o nesne \u00fczerinde ek i\u015flemler yapt\u0131k (<em>ResponseHeaders<\/em> bilgisi almak) ve nesnemizi Lua ve C# aras\u0131nda nas\u0131l kullanabilece\u011fimizi g\u00f6rd\u00fck.<\/p>\n<p><em><strong>4- Sonu\u00e7<\/strong><\/em><br \/>\nLua scriptlerini en basit \u015fekliyle C# yaz\u0131l\u0131mlar\u0131ndan kullanmay\u0131 g\u00f6rd\u00fck. Daha detayl\u0131 ve m\u00fcmk\u00fcnse tam entegrasyon sa\u011flanan bir \u00f6rne\u011fi de bir sonraki yaz\u0131mda g\u00f6sterece\u011fim. <\/p>\n<p>Bu tarz programlama \u015fekilleri bir\u00e7ok uygulamada ger\u00e7ekte kullan\u0131lmaktad\u0131r. Uygulama alanlar\u0131ndan en bilindik olan\u0131 bilgisayar oyunlar\u0131, sonras\u0131nda ise m\u00fchendislik yaz\u0131l\u0131mlar\u0131d\u0131r. <\/p>\n<p>Bilgisayar oyunlar\u0131nda genel olarak sahnelerin y\u00fcr\u00fct\u00fclmesi ve oyun nesnelerinin hareketleri (\u00e7ok y\u00fcksek performans gerektirmedi\u011finden ve oyun yap\u0131l\u0131rken s\u0131k s\u0131k de\u011fi\u015fece\u011finden) scriptler ile \u00e7\u00f6z\u00fcl\u00fcrken as\u0131l \u00f6nemli i\u015fler (ekrana modelin render edilmesi, multiplayer \u00f6zellikler, vb..) ger\u00e7ek programlama diliyle halledilir. <\/p>\n<p>M\u00fchendislik yaz\u0131l\u0131mlar\u0131nda ise genel olarak m\u00fchendisin parametrik olarak ekrandan girdi\u011fi de\u011ferlerin, arka plandaki n\u00fcmerik motorlara aktar\u0131lmas\u0131 ve \u00f6n i\u015flemlere tabi tutulmas\u0131 scriptler ile yap\u0131lmaktad\u0131r.<\/p>\n<p>Scriptler ile program geli\u015ftirmek i\u00e7in tek alternatif Lua de\u011fildir. \u00d6rne\u011fin m\u00fchendislik yaz\u0131l\u0131mlar\u0131nda s\u0131kl\u0131kla TCL kullan\u0131l\u0131r. Web taray\u0131c\u0131lar ise bildi\u011finiz gibi Javascript&#8217;i kullanmaktad\u0131r. Daha yayg\u0131n bir \u00f6rnek ise genel Linux yaz\u0131l\u0131mlar\u0131nda bash scriptlerin yaz\u0131l\u0131mlardan do\u011frudan kullan\u0131lmas\u0131 olabilir. Buna ek olarak asl\u0131nda bir\u00e7ok script dili, bir\u00e7ok programlama dili ile entegre edilebilir. C# ile Lua entegrasyonu i\u00e7in gereken bile\u015fenler hali haz\u0131rda kodlanm\u0131\u015f ve NLua k\u00fct\u00fcphanesi taraf\u0131ndan sunuldu\u011fundan \u00f6rneklerde Lua tercih edilmi\u015ftir.<\/p>\n<p>Umar\u0131m yaz\u0131mda ge\u00e7en bilgiler i\u015finize yarar, iyi kodlamalar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1- Giri\u015f Yaz\u0131l\u0131m geli\u015ftirirken s\u0131kl\u0131kla kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z bir durum \u015fudur: M\u00fc\u015fterinizin bir uygulama ile ilgili baz\u0131 talepleri olur. Siz bu talepleri al\u0131r, inceler ve bir SRS belgesi olu\u015fturursunuz. Akabinde&#8230;<\/p>\n","protected":false},"author":1,"featured_media":338,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[265,267,225],"tags":[273,287,289,277,291,283,285],"class_list":["post-332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-tr-tr","category-lua-tr","category-programlama-tr","tag-c-tr","tag-dinamik-tr","tag-dynamic-tr","tag-lua-tr","tag-script-tr","tag-scripting-tr","tag-scriptleme-tr"],"_links":{"self":[{"href":"http:\/\/18.193.70.38\/index.php?rest_route=\/wp\/v2\/posts\/332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/18.193.70.38\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/18.193.70.38\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/18.193.70.38\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/18.193.70.38\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=332"}],"version-history":[{"count":1,"href":"http:\/\/18.193.70.38\/index.php?rest_route=\/wp\/v2\/posts\/332\/revisions"}],"predecessor-version":[{"id":1208,"href":"http:\/\/18.193.70.38\/index.php?rest_route=\/wp\/v2\/posts\/332\/revisions\/1208"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/18.193.70.38\/index.php?rest_route=\/wp\/v2\/media\/338"}],"wp:attachment":[{"href":"http:\/\/18.193.70.38\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/18.193.70.38\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=332"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/18.193.70.38\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}