{"id":9455,"date":"2011-10-30T20:41:00","date_gmt":"2011-10-30T18:41:00","guid":{"rendered":"https:\/\/fatihboy.com\/post\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin"},"modified":"2011-10-30T20:41:00","modified_gmt":"2011-10-30T18:41:00","slug":"roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/","title":{"rendered":"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin"},"content":{"rendered":"<p>&nbsp;&nbsp; <a href=\"\/en\/?tag=roslyn\">Roslyn makale serisinde<\/a> bir \u00f6nceki makalemde size \u00e7al\u0131\u015fma-zaman\u0131nda derleyici API\u2019si yard\u0131m\u0131yla nas\u0131l kod \u00fcretebilece\u011finizi ve \u00fcretti\u011finiz bu kodu uygulaman\u0131z i\u00e7erisinde nas\u0131l kullanabilece\u011finizi g\u00f6stermi\u015ftim. Bu makalemde ise size teorik bir bilgi payla\u015fmak yerine bir \u00f6nceki makalemde verdi\u011fim bilgileri nas\u0131l ger\u00e7ek hayata uygulayabilece\u011finizi g\u00f6stermek istiyorum. Umuyorum ki anlatacaklar\u0131m en az benim ho\u015fuma gitti\u011fi kadar sizin de ho\u015funuza gidecek ve ufkunuzu a\u00e7acakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bu makalemde sizinle birlikte ad\u0131m ad\u0131m geli\u015ftirece\u011fimiz \u00f6rnek bir uygulama ile komut sat\u0131r\u0131n\u0131 kullanarak son kullan\u0131c\u0131dan ald\u0131\u011f\u0131m\u0131z komutlar\u0131 i\u015fletece\u011fiz. Bunun i\u00e7in bir konsol uygulamas\u0131 a\u00e7arak a\u015fa\u011f\u0131daki kodu yazal\u0131m;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace Com.Enterprisecoding.RoslynOrnegi {\n    class Program  {\n        static void Main(string[] args) {\n            while (true) {\n                Console.Write(\"Komut giriniz > \");\n                var komutAdi = Console.ReadLine();\n\n                try {\n                    var komut = KomutFabrikasi.KomutGetir(komutAdi);\n                    komut.Calis();\n                }\n                catch (Exception ex){\n                    Console.WriteLine(\"Komut \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rken hata olu\u015ftu : \" + ex.Message);\n                }\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131daki kod par\u00e7ac\u0131\u011f\u0131 sayesinden kullan\u0131c\u0131dan gelen komutlar\u0131 alarak bu komutlar\u0131 i\u015fleyecek s\u0131n\u0131flar\u0131 bulabilir ve \u00e7al\u0131\u015ft\u0131rabiliriz. Uygulama kullan\u0131c\u0131dan ald\u0131\u011f\u0131 komutu <strong>KomutFabrikasi<\/strong> s\u0131n\u0131f\u0131n\u0131n <strong>KomutGetir<\/strong> fonksiyonuna g\u00f6ndererek verilen komut i\u00e7in uygun s\u0131n\u0131f\u0131n bulunmas\u0131n\u0131 sa\u011flar.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public static class KomutFabrikasi {\n    public static IKomut KomutGetir(string komutAdi) {\n        switch (komutAdi) {\n            case \"Klas\u00f6r Listele\": return new KlasorListelemeKomutu();\n            case \"Dosya Sil\": return new DosyaSilKomutu();\n            case \"Dosya Olu\u015ftur\": return new DosyaOlusturKomutu();\n            case \"\u00c7\u0131k\u0131\u015f\": return new UygulamadanCikisKomutu();\n\n            default: throw new Exception(\"Belirtilen komut bulunamad\u0131\");\n        }\n    }\n\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Basit bir yap\u0131s\u0131 olan KomutFabrikasi s\u0131n\u0131f\u0131 gelen komuta g\u00f6re ilgili s\u0131n\u0131f\u0131 geri d\u00f6nd\u00fcrmekte. Geriye d\u00f6nen bu s\u0131n\u0131flarda uygulamam\u0131z\u0131n main fonksiyonu i\u00e7erisinde kullan\u0131lmakta. \u00d6rnek uygulamada kullanmak \u00fczere tasarlad\u0131\u011f\u0131m komut s\u0131n\u0131flar\u0131 ise a\u015fa\u011f\u0131da bulanabilir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\n\nnamespace Com.Enterprisecoding.RoslynOrnegi.Komutlar{\n    public interface IKomut {\n        void Calis();\n    }\n\n    public class KlasorListelemeKomutu : IKomut {\n        public void Calis() {\n            Console.WriteLine(\"Klas\u00f6r listeleme komutundan merhaba!\");\n        }\n    }\n    public class DosyaSilKomutu : IKomut  {\n        public void Calis() {\n            Console.WriteLine(\"Dosya silme komutundan merhaba!\");\n        }\n    }\n\n    public class DosyaOlusturKomutu : IKomut {\n        public void Calis()\n        {\n            Console.WriteLine(\"Dosya olu\u015fturma komutundan merhaba!\");\n        }\n    }\n\n    public class UygulamadanCikisKomutu : IKomut {\n        public void Calis() {\n            Environment.Exit(0);\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Buradaki komut s\u0131n\u0131flar\u0131n\u0131 daha kolay kullan\u0131labilmesi ad\u0131na ayr\u0131 bir dll projesi i\u00e7erisine yerle\u015ftirelim. A\u015fa\u011f\u0131da, uygulamam\u0131z\u0131 derleyip \u00e7al\u0131\u015ft\u0131rmam\u0131z sonras\u0131nda nas\u0131l kullan\u0131c\u0131 etkile\u015fimli olarak kullan\u0131labildi\u011fi g\u00f6r\u00fclebilir;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/Roslyn-rnei.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/Roslyn-rnei_thumb.png\" alt=\"\u00d6rnek uygulamam\u0131z\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda bu \u015fekilde kullan\u0131labilir\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp; G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi olduk\u00e7a basit bir mant\u0131\u011f\u0131 olan uygulamam\u0131z kullan\u0131c\u0131 geri d\u00f6n\u00fc\u015flerini komutlara d\u00f6n\u00fc\u015ft\u00fcrebilme yetene\u011fine sahip, h\u0131zl\u0131 ve olduk\u00e7a kullan\u0131\u015fl\u0131; fakat tasar\u0131m\u0131m\u0131z\u0131n \u00f6nemli bir zay\u0131f noktas\u0131 bulunuyor : <strong>geni\u015fletilebilir de\u011fil!<\/strong> Yeni bir komut eklemek i\u00e7in \u00f6ncelikle <strong>IKomut<\/strong> aray\u00fcz\u00fcn\u00fc implemente etmeli, ard\u0131ndan da KomutFabrikasi.KomutGetir fonksiyonu i\u00e7erisine yeni bir girdi eklemeliyiz. Bu konu uygulamam\u0131z\u0131n tamamen kendimiz taraf\u0131nda geli\u015ftirilmesi durumunda b\u00fcy\u00fck bir problem olu\u015fturmasa da kurumsal bir uygulamada 3.parti firmalar\u0131n da eklenti geli\u015ftirebilmesi isteniyorsa maalesef ki aya\u011f\u0131m\u0131za k\u00f6stek olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Alternatif olarak <strong>relfection<\/strong> y\u00f6ntemi kullan\u0131labilir. KomutGetir fonksiyonu \u00e7a\u011f\u0131r\u0131ld\u0131\u011f\u0131nda y\u00fckl\u00fc assembly\u2019ler taranarak komutlar ve komut s\u0131n\u0131flar\u0131 bulunabilir ve bulunan s\u0131n\u0131flar ilklendirilebilir. Tabi b\u00f6ylesi bir tasar\u0131mda komut s\u0131n\u0131flar\u0131m\u0131za e\u015fle\u015fecekleri komutun ad\u0131n\u0131 belirtmeliyiz; ki bunu da ancak \u00f6z nitelikle yard\u0131m\u0131yla komut s\u0131n\u0131flar\u0131 \u00fczerinde meta veri saklayarak yapabiliriz. A\u015fa\u011f\u0131da bu ama\u00e7la kullanabilece\u011fimiz \u00f6z nitelik s\u0131n\u0131f\u0131n\u0131 ve bu \u00f6z nitelik yard\u0131m\u0131yla yeniden tan\u0131mlanm\u0131\u015f olan komut s\u0131n\u0131flar\u0131n\u0131 bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]\npublic sealed class KomutAttribute : Attribute {\n    private readonly string komut;\n\n    public KomutAttribute(string komut) {\n        this.komut = komut;\n    }\n\n    public string Komut {\n        get { return komut; }\n    }\n}\n\npublic interface IKomut {\n    void Calis();\n}\n\n[Komut(\"Klas\u00f6r Listele\")]\npublic class KlasorListelemeKomutu : IKomut {\n    public void Calis() {\n        Console.WriteLine(\"Klas\u00f6r listeleme komutundan merhaba!\");\n    }\n}\n\n[Komut(\"Dosya Sil\")]\npublic class DosyaSilKomutu : IKomut  {\n    public void Calis() {\n        Console.WriteLine(\"Dosya silme komutundan merhaba!\");\n    }\n}\n\n[Komut(\"Dosya Olu\u015ftur\")]\npublic class DosyaOlusturKomutu : IKomut {\n    public void Calis()\n    {\n        Console.WriteLine(\"Dosya olu\u015fturma komutundan merhaba!\");\n    }\n}\n\n[Komut(\"\u00c7\u0131k\u0131\u015f\")]\npublic class UygulamadanCikisKomutu : IKomut {\n    public void Calis() {\n        Environment.Exit(0);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp; Bu de\u011fi\u015fiklikler ard\u0131ndan KomutGetir fonksiyonumuzu yeniden d\u00fczenleyerek yeni tasar\u0131m\u0131m\u0131za uygun hale getirebiliriz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public static IKomut KomutGetir(string komutAdi) {\n    var komutArayuzTuru = typeof(IKomut);\n    var komutTurleri = AppDomain.CurrentDomain\n                        .GetAssemblies()\n                        .ToList()\n                        .SelectMany(assembly => assembly.GetTypes())\n                        .Where(type => komutArayuzTuru.IsAssignableFrom(type) &amp;&amp; !type.IsAbstract);\n\n    foreach (var komutTuru in komutTurleri) {\n        var metaVeri = komutTuru.GetCustomAttributes(typeof(KomutAttribute), true)\n                        .Select(attribute => (KomutAttribute)attribute)\n                        .Where(komutAttribute => komutAttribute.Komut == komutAdi);\n\n        if (metaVeri != null) {\n            var varsayilanConstructer = komutTuru.GetConstructor(new Type[0]);\n\n            if (varsayilanConstructer == null) {\n                throw new Exception(\"Belirtilen tur varsay\u0131lan bir constructer'a sahip de\u011fil\");\n            }\n\n            var sinifOrnegi = varsayilanConstructer.Invoke(null);\n\n            return (IKomut)sinifOrnegi;\n        }\n    }\n\n    throw new Exception(\"Belirtilen komut tan\u0131ml\u0131 de\u011fil!\");\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yeni tasar\u0131m\u0131m\u0131z bize eskisine g\u00f6re \u00e7ok daha fazla esneklik sunacakt\u0131r. Bu tasar\u0131m sayesinde yeni bir komut eklemek i\u00e7in sadece komut s\u0131n\u0131f\u0131n\u0131 olu\u015fturup KomutAttribute \u00f6z niteli\u011fini eklememiz yeterli olacak. Reflection y\u00f6ntemi bize ihtiyac\u0131m\u0131z olan esnekli\u011fi sunmakla birlikte beraberinde belirli bir maliyeti de olacakt\u0131r ve h\u0131zdan bir miktar feragat etmemiz gerekecektir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u0130\u015fte tam da bu noktada devreye makalemin sadece ba\u015f\u0131nda s\u00f6z etti\u011fim Roslyn CTP girmekte. Pek Roslyn CTP kullanarak bu kodu nas\u0131l daha h\u0131zland\u0131rabiliriz?<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bu sorunun cevab\u0131 asl\u0131nda basit; kodu derleme \u00f6ncesi elle yaz\u0131yor olsayd\u0131k nas\u0131l yaz\u0131yorsak ayn\u0131 kodu \u00e7al\u0131\u015fma-zaman\u0131 uygulamam\u0131z\u0131 analiz ederek Roslyn CTP ile \u00fcretmeli, ard\u0131nda olu\u015fan assembly\u2019yi y\u00fckleyerek kullanmal\u0131y\u0131z. Tabi ki bunu yaparken baz\u0131 p\u00fcf noktalar\u0131 da bulunuyor; ki bunlar\u0131 a\u015fa\u011f\u0131da yeni haliyle payla\u015ft\u0131\u011f\u0131m KomutFabrikasi s\u0131n\u0131f\u0131nda bulabilirsiniz.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public static class KomutFabrikasi {\nprivate delegate IKomut KomutGetirDelegate(string komutAdi);\n    private static KomutGetirDelegate gercekKomutGetir;\n\n    static KomutFabrikasi()  {\n        var kod = @\"using System;\nusing Com.Enterprisecoding.RoslynOrnegi.Komutlar;\n\nnamespace Com.Enterprisecoding.RoslynOrnegi {{\n        class GercekKomutFabrikasi {{\n                public static IKomut KomutGetir(string komutAdi) {{\n                {0}\n\n                default: throw new Exception(\"\"Belirtilen komut bulunamad\u0131\"\");\n                }}\n        }}\n}}\";\n\n        var caseIfadeleri = new List&lt;string>();\n        var komutArayuzTuru = typeof(IKomut);\n        var komutTurleri = AppDomain.CurrentDomain\n                            .GetAssemblies()\n                            .ToList()\n                            .SelectMany(assembly => assembly.GetTypes())\n                            .Where(type => komutArayuzTuru.IsAssignableFrom(type) &amp;&amp; !type.IsAbstract);\n\n        foreach (var komutTuru in komutTurleri) {\n            var komutOzniteligi = komutTuru.GetCustomAttributes(typeof(KomutAttribute), true)\n                                            .FirstOrDefault() as KomutAttribute;\n\n            if (komutOzniteligi != null) {\n                caseIfadeleri.Add(string.Format(@\"case \"\"{0}\"\" : return new {1}();\", komutOzniteligi.Komut, komutTuru.Name));\n            }\n        }\n        kod = string.Format(kod, string.Join(Environment.NewLine, caseIfadeleri));\n\n        var assemblyAdi = \"Enterprisecoding-\" + Guid.NewGuid() + \".dll\";\n\n        var sozDizinAgaci = SyntaxTree.ParseCompilationUnit(kod);\n        var derleme = Compilation.Create(\n            assemblyAdi,\n            options: new CompilationOptions(assemblyKind: AssemblyKind.DynamicallyLinkedLibrary),\n            syntaxTrees: new[] { sozDizinAgaci },\n            references: new[] {\n                new AssemblyFileReference(typeof(object).Assembly.Location), \/\/mscorlib.dll\n                new AssemblyFileReference(typeof(IKomut).Assembly.Location),\n            });\n\n        Assembly derlenmisAssembly;\n        using (var akis = new MemoryStream())  {\n            var derlemeSonucu = derleme.Emit(akis);\n            derlenmisAssembly = Assembly.Load(akis.GetBuffer());\n        }\n\n        var gercekKomutFabrikasiTuru = derlenmisAssembly.GetType(\"Com.Enterprisecoding.RoslynOrnegi.GercekKomutFabrikasi\");\n        var komutGetirMetodu = gercekKomutFabrikasiTuru.GetMethod(\"KomutGetir\");\n        gercekKomutGetir = (KomutGetirDelegate)Delegate.CreateDelegate(typeof(KomutGetirDelegate), komutGetirMetodu);\n    }\n\n    public static IKomut KomutGetir(string komutAdi) {\n        return gercekKomutGetir(komutAdi);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yeni kodumuzda uygulama static KomutFabrikasi s\u0131n\u0131f\u0131m\u0131z\u0131 ilk kez \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda static constructer\u2019\u0131n\u0131n i\u00e7erisindeki kodlar\u0131 bir defal\u0131k \u00e7al\u0131\u015ft\u0131racakt\u0131r. Buradaki kodlar ise \u00f6ncelikle y\u00fckl\u00fc assembly\u2019ler i\u00e7erisindeki komutlar\u0131 bulacak ve daha sonra&nbsp; bu komutlar i\u00e7in string olarak \u00f6rne\u011fimizin ilk halindeki kodu olu\u015fturacakt\u0131r. Takip eden sat\u0131rlarda ise \u00f6nceki makalemde payla\u015ft\u0131\u011f\u0131m \u015fekilde bu string ifade derlenerk bir assembly\u2019ye d\u00f6n\u00fc\u015ft\u00fcr\u00fclecek ve haf\u0131zaya y\u00fcklenecektir. Bu noktada dikkat ederseniz reflection ile elde etti\u011fim olu\u015fan yeni GercekKomutFabrikasi.KomutGetir fonksiyonunu \u00e7a\u011f\u0131rmak i\u00e7in reflection de\u011fil delegate kullanmaktay\u0131m. Bu \u015fekilde hem daha okunakl\u0131 hem de daha h\u0131zl\u0131 bir kullan\u0131ma sahip olmaktay\u0131m. Son haliyle uygulamam\u0131za bir breakpoint koyut olu\u015fturulan kod string\u2019ine g\u00f6z atacak olursak a\u015fa\u011f\u0131daki gibi bir \u00e7\u0131kt\u0131 g\u00f6receksiniz,; ki bu da ilk \u00f6rne\u011fimizle ayn\u0131;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing Com.Enterprisecoding.RoslynOrnegi.Komutlar;\n\nnamespace Com.Enterprisecoding.RoslynOrnegi {\n        class GercekKomutFabrikasi {\n                public static IKomut KomutGetir(string komutAdi) {\n                case \"Klas\u00f6r Listele\" : return new KlasorListelemeKomutu();\ncase \"Dosya Sil\" : return new DosyaSilKomutu();\ncase \"Dosya Olu\u015ftur\" : return new DosyaOlusturKomutu();\ncase \"\u00c7\u0131k\u0131\u015f\" : return new UygulamadanCikisKomutu();\n\n                default: throw new Exception(\"Belirtilen komut bulunamad\u0131\");\n                }\n        }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu noktada d\u00fc\u015fmem gereken \u00f6nemli bir nokta; hen\u00fcz CTP seviyesinde olan Roslyn\u2019in case ifadelerini desteklemedi\u011fi (<em>desteklenmeyen t\u00fcm \u00f6zellikleri listesi <a href=\"\/en\/?p=9452\">bu makalemde<\/a> bulabilirsiniz<\/em>). Bu durumda da maalesef yukar\u0131daki kod case ifadeleri nedeniyle derlenmeyecektir. Konunun anla\u015f\u0131lmas\u0131 ad\u0131na bu haliyle payla\u015ft\u0131\u011f\u0131m ve ilerleyen s\u00fcr\u00fcmlerde derlenebiliyor olacak olan kodu mevcut CTP s\u00fcr\u00fcm\u00fcnde de derleyip \u00e7al\u0131\u015ft\u0131rmak i\u00e7in if ifadeleri kullanabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private delegate IKomut KomutGetirDelegate(string komutAdi);\nprivate static KomutGetirDelegate gercekKomutGetir;\n\nstatic KomutFabrikasi()  {\n    var kod = @\"using System;\nusing Com.Enterprisecoding.RoslynOrnegi.Komutlar;\n\nnamespace Com.Enterprisecoding.RoslynOrnegi {{\n    class GercekKomutFabrikasi {{\n            public static IKomut KomutGetir(string komutAdi) {{\n            {0}\n            else {{ throw new Exception(\"\"Belirtilen komut bulunamad\u0131\"\"); }}\n            }}\n    }}\n}}\";\n\n    var ifIfadeleri = new List&lt;string>();\n    var komutArayuzTuru = typeof(IKomut);\n    var komutTurleri = AppDomain.CurrentDomain\n                        .GetAssemblies()\n                        .ToList()\n                        .SelectMany(assembly => assembly.GetTypes())\n                        .Where(type => komutArayuzTuru.IsAssignableFrom(type) &amp;&amp; !type.IsAbstract);\n\n    foreach (var komutTuru in komutTurleri) {\n        var komutOzniteligi = komutTuru.GetCustomAttributes(typeof(KomutAttribute), true)\n                                        .FirstOrDefault() as KomutAttribute;\n\n        if (komutOzniteligi != null) {\n            ifIfadeleri.Add(string.Format(@\"if (komutAdi == \"\"{0}\"\") {{ return new {1}(); }}\",komutOzniteligi.Komut, komutTuru.Name));\n        }\n    }\n    kod = string.Format(kod, string.Join(\" else \", ifIfadeleri));\n\n    var assemblyAdi = \"Enterprisecoding-\" + Guid.NewGuid() + \".dll\";\n\n    var sozDizinAgaci = SyntaxTree.ParseCompilationUnit(kod);\n    var derleme = Compilation.Create(\n        assemblyAdi,\n        options: new CompilationOptions(assemblyKind: AssemblyKind.DynamicallyLinkedLibrary),\n        syntaxTrees: new[] { sozDizinAgaci },\n        references: new[] {\n            new AssemblyFileReference(typeof(object).Assembly.Location), \/\/mscorlib.dll\n            new AssemblyFileReference(typeof(IKomut).Assembly.Location),\n        });\n\n    Assembly derlenmisAssembly;\n    using (var akis = new MemoryStream())  {\n        var derlemeSonucu = derleme.Emit(akis);\n        derlenmisAssembly = Assembly.Load(akis.GetBuffer());\n    }\n\n    var gercekKomutFabrikasiTuru = derlenmisAssembly.GetType(\"Com.Enterprisecoding.RoslynOrnegi.GercekKomutFabrikasi\");\n    var komutGetirMetodu = gercekKomutFabrikasiTuru.GetMethod(\"KomutGetir\");\n    gercekKomutGetir = (KomutGetirDelegate)Delegate.CreateDelegate(typeof(KomutGetirDelegate), komutGetirMetodu);\n}\n\npublic static IKomut KomutGetir(string komutAdi) {\n    return gercekKomutGetir(komutAdi);\n}\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Kodumuzun performans\u0131n\u0131 artt\u0131rmak ad\u0131na yap\u0131labilecek son bir d\u00fczenleme ise Roslyn CTP ile olu\u015fan assembly\u2019yi \u00e7al\u0131\u015fma-zaman\u0131nda haf\u0131zaya y\u00fckleme yerine dosya sistemine saklamak ve buradan y\u00fcklemek olabilir. Bu \u015fekilde uygulaman\u0131n takip eden \u00e7al\u0131\u015ft\u0131r\u0131lmalar\u0131nda tekrar tekrar derlemek yerine varsa do\u011frudan bu assembly y\u00fcklenebilir. Bu sayede derleme maliyeti sadece ilk kullan\u0131m i\u00e7in s\u00f6z konusu olaca\u011f\u0131ndan daha da performansl\u0131 bir uygulamaya sahip olabiliriz.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Umar\u0131m payla\u015ft\u0131\u011f\u0131m bu \u00f6rnek Roslyn CTP\u2019nin ne kadar g\u00fc\u00e7l\u00fc oldu\u011fu konusunda size fikir verebilmi\u015ftir. Yarat\u0131c\u0131 fikirler ve Roslyn bir araya geldi\u011finde yukar\u0131daki \u00f6rne\u011fimize benzer \u015fekilde kendi kendini de\u011fi\u015ftiren, kullan\u0131m\u0131na g\u00f6re \u015fekillenen performansl\u0131 uygulamalar kolayl\u0131kla geli\u015ftirilebilir.<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp; Roslyn makale serisinde bir \u00f6nceki makalemde size \u00e7al\u0131\u015fma-zaman\u0131nda derleyici API\u2019si yard\u0131m\u0131yla nas\u0131l kod \u00fcretebilece\u011finizi ve \u00fcretti\u011finiz bu kodu uygulaman\u0131z i\u00e7erisinde nas\u0131l kullanabilece\u011finizi g\u00f6stermi\u015ftim. Bu makalemde ise size teorik bir bilgi payla\u015fmak yerine bir \u00f6nceki makalemde verdi\u011fim bilgileri nas\u0131l ger\u00e7ek hayata uygulayabilece\u011finizi g\u00f6stermek istiyorum. Umuyorum ki anlatacaklar\u0131m en az benim ho\u015fuma gitti\u011fi kadar sizin de&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":9459,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[137],"class_list":["post-9455","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csharp","category-turkce","tag-roslyn"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp;&nbsp; Roslyn makale serisinde bir \u00f6nceki makalemde size \u00e7al\u0131\u015fma-zaman\u0131nda derleyici API\u2019si yard\u0131m\u0131yla nas\u0131l kod \u00fcretebilece\u011finizi ve \u00fcretti\u011finiz bu kodu uygulaman\u0131z i\u00e7erisinde nas\u0131l kullanabilece\u011finizi g\u00f6stermi\u015ftim. Bu makalemde ise size teorik bir bilgi payla\u015fmak yerine bir \u00f6nceki makalemde verdi\u011fim bilgileri nas\u0131l ger\u00e7ek hayata uygulayabilece\u011finizi g\u00f6stermek istiyorum. Umuyorum ki anlatacaklar\u0131m en az benim ho\u015fuma gitti\u011fi kadar sizin de...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2011-10-30T18:41:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png\" \/>\n\t<meta property=\"og:image:width\" content=\"209\" \/>\n\t<meta property=\"og:image:height\" content=\"208\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin\",\"datePublished\":\"2011-10-30T18:41:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\"},\"wordCount\":1080,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png\",\"keywords\":[\"Roslyn\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\",\"url\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\",\"name\":\"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png\",\"datePublished\":\"2011-10-30T18:41:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png\",\"width\":209,\"height\":208},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin - Fatih Boy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihboy.com\/en\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/","og_locale":"en_US","og_type":"article","og_title":"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin - Fatih Boy","og_description":"&nbsp;&nbsp; Roslyn makale serisinde bir \u00f6nceki makalemde size \u00e7al\u0131\u015fma-zaman\u0131nda derleyici API\u2019si yard\u0131m\u0131yla nas\u0131l kod \u00fcretebilece\u011finizi ve \u00fcretti\u011finiz bu kodu uygulaman\u0131z i\u00e7erisinde nas\u0131l kullanabilece\u011finizi g\u00f6stermi\u015ftim. Bu makalemde ise size teorik bir bilgi payla\u015fmak yerine bir \u00f6nceki makalemde verdi\u011fim bilgileri nas\u0131l ger\u00e7ek hayata uygulayabilece\u011finizi g\u00f6stermek istiyorum. Umuyorum ki anlatacaklar\u0131m en az benim ho\u015fuma gitti\u011fi kadar sizin de...Read More","og_url":"https:\/\/fatihboy.com\/en\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/","og_site_name":"Fatih Boy","article_published_time":"2011-10-30T18:41:00+00:00","og_image":[{"width":209,"height":208,"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png","type":"image\/png"}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin","datePublished":"2011-10-30T18:41:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/"},"wordCount":1080,"commentCount":0,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png","keywords":["Roslyn"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/","url":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/","name":"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png","datePublished":"2011-10-30T18:41:00+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2011\/10\/ai_thumb.png","width":209,"height":208},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/roslyn-ile-birakin-uygulamaniz-kendini-gelistirsin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"Roslyn ile B\u0131rak\u0131n Uygulaman\u0131z Kendini Geli\u015ftirsin"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/9455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=9455"}],"version-history":[{"count":0,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/9455\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media\/9459"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=9455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=9455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=9455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}