İlkay İlknur

just a developer...

Add Service Reference Ekranında Alınan Proxy Authentication Required Hatasının Çözümü

Merhaba Arkadaşlar,

Kimi zamanlar şirket içerisinde geliştirdiğimiz uygulamalarda 3rd party web servislerini kullanmak zorunda kalabiliyoruz. Bu servisleri Visual Studio içerisinde Add Service Reference ekranını kullanarak eklemeye çalıştığımızda ise "Proxy Authentication Required" hatası ile karşı karşıya kalabilmekteyiz. Bunun nedeni ise Visual Studio içerisinde bulunan Add Service Reference ekranının default olarak bizim ayarlamış olduğumuz proxy ayarlarını kullanmaması.

Bu sorunun çözümü için ise yapmamız gereken tek şey aşağıdaki konfigürasyonu servis referansını eklemeden önce config dosyasına eklemek.

<system.net> <defaultProxy useDefaultCredentials="true" /> </system.net>

Kolay Gelsin,



Roslyn - Scripting API ve C# Interactive Window

Merhaba Arkadaşlar,

Bir önceki yazımızda sizlerle Compiler As a Service konseptini inceleyerek Roslyn projesinin temelini oluşturan kavramları ve servisleri kısaca ve tamemen teorik olarak incelemiştik. Bu yazımızdan itibaren Roslyn ile derinlere dalmaya başlayacağız ve uygulamalı olarak Roslyn’i kullanmaya başlayacağız.

Önceki yazımızda Compiler içerisindeki servislerin birer API ile dışarıya açılmasının getireceği yeniliklerden bahsederken ilk sırada programlama dillerinin scripting özelliği kazanmasını söylemiştik. Scripting özelliği ile aslında uygulamalar içerisinde C# veya VB kodlarının dinamik olarak çalıştırılmasından söz etmekteyiz. Özellikle IronPython gibi dinamik programlama dillerine baktığımızda bu şekilde scripting özellikleri programlama dilinin yapısından dolayı mümkün olabilmekte. Hatta C# 4.0 ile beraber gelen dinamik programlama yenilikleri ve DLR (Dynamic Language Runtime) ile uygulamalarımız içerisinde şu anda Dinamik Programlama dillerinin kodlarını çalıştırabilmekteyiz.

Ancak konu C# ve VB kodlarının dinamik olarak çalıştırılabilmesine geldiğinde Roslyn öncesine kadar böyle bir şeyi gerçekleştirmek bizler için çok kolay değildi. Bunun için Reflection ve CodeDom tarafında bir takım derleme işlemleri yapmak gerekmekteydi.

Roslyn içerisinde bulunan Scripting API ile artık C# ve VB kodlarını uygulamalar içerisinde hızlı bir şekilde işletip sonuçlarını alabilmekteyiz. Şimdi ilk olarak bir Console uygulaması yaratalım ve bu uygulama içerisinden kodlarımızı dinamik olarak çalıştıralım.(Makale boyunca görmüş olduğunuz kodları çalıştırabilmek için  Roslyn.Compilers ve Roslyn.Compiler.CSharp dll’lerini referans olarak eklemeniz gerekmekte.)

ScriptEngine engine = new ScriptEngine();
engine.Execute(@"System.Console.WriteLine(""Hello Roslyn !!!"");");
Yukarıdaki kodu doğrudan çalıştırdığımızda string olarak yazmış olduğumuz kodun C# compilerı tarafından işletildiğini ve Console uygulamamızın ekranına "Hello Roslyn !!!” yazdığını görüyoruz.

Şimdi biraz daha ileri gidelim ve değişken tanımlayıp bu tanımladığımız değişkeni bir alt satırda yazmış olduğumuz bir başka dinamik kod içerisinde kullanalım.
ScriptEngine engine = new ScriptEngine();
engine.Execute(@"int x = 5;");
engine.Execute(@"System.Console.WriteLine(x);");
Yazmış olduğumuz kodu çalıştırdığımızda bakalım ne ile karşılaşacağız :)

Compiler tarafından ilk olarak yaptığımız tanımlama işletildikten sonra 2. sırada yazmış olduğumuz tanımladığımız değişkenin değerini Console’a yazdıran kod işletildiği sırada yukarıdaki exception fırlatılmakta ve x değişkeninin context içerisinde bulunmadığı söylenmekte. ;)

Buradan da çıkaracağımız sonuç şu olmalı ki ScriptEngine tipi içerisinde bulunan Execute metoduna sadece string olarak verdiğimiz C# veya VB kodları işletildikten sonra bu kodlar içerisinde yapılmış olan tüm tanımlamalar compiler tarafından unutulmakta. Peki bu tanımlamaların unutulmaması için ne yapmamız gerekiyor ?

Execution Context

C# veya VB kodlarının dinamik olarak işletilmesi sırasında daha önceden işletilen kodlarının compiler tarafından unutulmaması için kodların içerisinde çalıştırılacağı bir context belirlememiz gerekmekte. Bunun için de Roslyn tarafında kodumuzun içerisinde işletileceği bir Session belirlememiz gerekmekte ve Execute metoduna parametre olarak vereceğimiz kodun yaratmış olduğumuz Session içerisinde işletilmesi gerektiğini bildirmemiz gerekmekte.

ScriptEngine engine = new ScriptEngine();
Session session = Session.Create();
engine.Execute(@"int x = 5;", session);
engine.Execute(@"System.Console.WriteLine(x);", session);
Şimdi biraz daha ileriye gidelim ve session içerisinde bir metot tanımlayalım ve daha sonra bu metodu çağıralım.
ScriptEngine engine = new ScriptEngine();
Session session = Session.Create();
engine.Execute(@"void Print (object x){ System.Console.WriteLine(x);}",session);
engine.Execute(@"int x = 5;", session);
engine.Execute(@"Print(x)", session);
Şu ana kadar Roslyn tarafında dinamik kod işletme ile ilgili olarak temel kısımları inceledik. Ancak incelememiş olduğumuz bir nokta kaldı. O da dinamik olarak işletmiş olduğumuz kodun aslında çalıştırılmış olduğu host uygulama ile nasıl iletişimde olacağı.

Host Object

Host uygulama ile iletişimde bulunmak için Roslyn tarafında Host Object yapısını kullanmamız gerekmekte. Host Object dediğimiz yapı aslında herhangi bir tip olabilmekte. Bu tip, tanımlamış olduğumuz session içerisine dahil edilmekte ve böylece biz de dinamik olarak işleteceğimiz kodlar tarafında bu host object içerisinde bulunan tüm public üyelere erişebilmekteyiz ve istediğimiz işlemleri gerçekleştirebilmekteyiz. Örnek olarak host uygulama içerisnde şu şekilde içerisinde sayıları tutan ve bir takım işlemler gerçekleştiren bir sınıf tanımlayalım.

public class NumberList
{
 List<int> numbers = new List<int>();

 
 void Add(int i)
 {
 numbers.Add(i);
 }
 void PrintNumbers()
 {
 for (int i = 0; i < numbers.Count; i++)
 {
 Console.WriteLine("{0}- {1}", i + 1, numbers[i]);
 }
 }
}
 

Yukarıda tanımlamış olduğumuz tip host uygulama olan Console uygulamamızda yer almakta. Şimdi sıra geldi bu tipi nasıl kullanacağımıza. Eğer bir tipi host object olarak kullanmak istiyorsak öncelikli olarak bu tipi ilgili Script Engine ve Session tiplerine bildirmemiz gerekmekte.

NumberList numberList = new NumberList();
ScriptEngine engine = new ScriptEngine(new[] 
 { typeof(NumberList).Assembly.Location });
Session session = Session.Create(numberList);
engine.Execute("Add(3);", session);
engine.Execute("Add(5)", session);
engine.Execute("PrintNumbers()", session);
Uygulamamızı çalıştırdığımızda aşağıdaki gibi bir çıktı ile karşılaşmaktayız.

C# Interactive Window

C# ve VB programlama dillerine Scripting özelliğinin gelmesiyle beraber yapılabilecekler düşünüldüğünde aklımıza ilk olarak REPL(Read-Eval-Print-Loop) uygulamaları gelmekte. Yukarıda yapmış olduğumuz örneklere baktığımızda aslında bir REPL uygulaması yapmak için hemen hemen tüm parçalar elimizde. Bu nedenle REPL uygulaması kısmını tamamen size bırakıyorum ;) Ancak yine de takıldığınız noktalar olursa zaten internette Roslyn ile yapılmış pek çok REPL uygulaması bulunmakta bunlardan yararlanabilirsiz ya da İletişim bölümünden bana ulaşabilirsiniz.

Makalemizin sonlarına gelirken makalenin bu bölümünde aslında yine Roslyn ile beraber gelen ve Visual Studio içerisine entegre edilen bir REPL uygulamasından bahsediyor olacağım. Roslyn paketini bilgisayarınıza yükledikten sonra Visual Studio içerisinde View => Other Windows yolunu izlediğinizde burada “C# Interactive Window” seçeneğini görüyor olacaksınız. Buraya tıkladığımızda karşımıza gelen aslında C# kodları ile çalışan bir REPL uygulaması. Bu uygulama ile hızlı bir şekilde istediğimiz kodu yazıp sonucunu görebilmekteyiz.

Şimdi isterseniz buraya bir takım kodlar yazalım ve sonuçlarını inceleyelim.

Gördüğünüz gibi aslında bir C# uygulaması içerisinde yapabileceğimiz pek çok şeyi bu Window içerisinde yapabilmekteyiz ve sonuçlarını hemen görebilmekteyiz. Peki diğer dil özellikleri bu Window içerisinde destekleniyor mu diye soracak olursanız aslında compiler tarafından sağlanan bilgiler ile çalışan outlining, colorizer, intellisense gibi özellikler de bu window içerisinde çalışmakta. Burdan da anlıyoruz ki aslında compiler tarafından sağlanan farklı farklı API’lar birbirlerinden bağımsız olarak beraberce çalışabilmekteler. ;)

C# Interactive Window içerisinde bilmemiz gereken en önemli komutlardan biri de library referansı ekleme komutudur. #r “LibraryName” komutu ile Interactive Window içerisinde çalıştıracağınız kodlar ile ilgili gerekli referansları ekleyebilirsiniz.

Bunun yanında Interactive Window içerisindeki en güzel özelliklerden biri de yazmış olduğunuz uygulama içerisindeki kodları hızlı bir şekilde işletebilme ve sonuçlarını inceleyebilme şansı vermesi. Bunun için çalıştırmak istediğiniz kodu seçip Ctrl+Enter yapmanız yeterli. Yazmış olduğunuz kod Interactive Window içerisine kopyalanmakta ve işletilmekte. ;)

Eğer bir takım referanslar Interactive Window içerisinde tanımlı değilse kopyalamış olduğunuz kod Interactive Window içerisinde çalıştırılamayabilir. Bu nedenle öncelikle uygulama içerisinde referansların Interactive Window içerisinde referans olarak eklendiğinden emin olmamız gerekmekte. Bunun için de ilgili Project’e sağ tıklayarak “Reset Interactive Window From Project”’i seçmemiz gerekmekte.

Bu noktadan sonra ise artık yapmamız gereken ilgili kodu seçip Ctrl+Enter ile C# Interactive Window içerisinde işletmek.

Not : Interactive Window şu anda sadece C# için bulunmaktadır. İlerleyen sürümlerde VB için de Interactive Window duyurulacaktır.

Gördüğünüz gibi Compiler As a Service (CaaS) konsepti oldukça geniş ve bir o kadar da eğlenceli bir konu :) Bu yazımızda her ne kadar sadece Scripting API’yi incelemiş olsakta sırf bu API’yı kullarak bile yapabileceğimiz pek çok şey bulunmakta. Bu yüzden bir C# veya VB developer olarak herkese Roslyn projesini takip etmesini öneriyorum.

Umarım sizler için faydalı bir makale olmuştur.

Not: Makale içerisindeki kodlar Roslyn CTP-1 ile yazılmış ve test edilmiştir.



NuGet Package Manager

Merhaba Arkadaşlar,

Açık kaynak kütüphaneler ile uygulama geliştirirken karşılaştığımız en önemli sorunlardan biri de kütüphanelerin elde edilmesi, güncellenmesi ve bağlı olduğu diğer kütüphanelerin elde edilmesi sırasında ortaya çıkan sorunlar. Örneğin bir kütüphaneyi indirdikten sonra tam projemize referans edip kullanmaya başlayacağımız sırada indirdiğimizin kütüphanenin başka bir kütüphaneye bağlı olduğunu görebilmekte ve bu sefer gidip o kütüphaneyi indirmek gibi sıkıcı süreçlerle karşılaşabilmekteyiz.

Özellikle Microsoft cephesine baktığımızda bu şekilde bir süreci otomatize eden bir yapı bulunmamaktaydı. Ancak ASP.NET takımı tarafından geliştirilen NuGet doğrudan Visual Studio içerisine entegre olarak çalışmakta ve shell scriptleri ile ilgili kütüphanelerin ve diğer bağımlı kütüphanelerin indirilerek projeye referans edilmesini sağlamakta. İsterseniz gelin çok fazla uzatmadan NuGet'i indirelim ve inceleyelim.

NuGet Kurulumu

NuGet'i kurmak için eklentilerde olduğu gibi 2 yol bulunmakta. Bunlardan biri doğrudan CodePlex üzerinden kurulum dosyasını indirerek kurmak. Diğeri ise Visual Studio içerisinde bulunan Extension Manager'ı kullanmak.

İndirme ve yükleme aşamasını geçtikten sonra NuGet’I kullanmak için Visual Studio’yu yeniden başlatmamız yeterli.

NuGet Kullanımı

İlk olarak bir Silverlight projesi yaratalım ve Silverlight uygulamalarımızda sıklıkla kullandığımız Silverlight Toolkit bileşenlerini NuGet ile projemize ekleyelim.

Projemizi yarattıktan sonra NuGet konsoluna erişmek için View=>Other Windows menüsündeki “Package Manager Console”’u seçmemiz gerekmekte.

Ortamımızı hazırladıktan sonra yapmamız gereken artık ilgili paketleri projemize eklemek. Ama önce isterseniz NuGet kullanırken ihtiyaç duyacağımız bazı komutlara göz atalım.

    • get-package –remote : Bu komut ile NuGet sunucusu üzerinde indirilmeye hazır olarak bulunan kütüphanelerin listesi elde edilir.
 
  • get-package –remote –filter (kriterler) : Bu komut ile NuGet sunucusu üzerinde indirilmeye hazır olarak bulunan kütüphanelerin belirtilen filter kriterine göre Description sahası uygun olan kütüphaneler listelenir.
    • Install-Package (Kütüphane Adı) : Bu komut ile adı verilen kütüphane, proje içerisine indirilerek projeye referans edilir ve gerekli olduğu durumlarda config dosyaları güncellenir.

EDIT : NuGet konsolunda çalışacak olan komutlarla ilgili daha fazla bilgi edinmek için buradaki linkten faydalanabilirsiniz.

Evet arkadaşlar gördüğünüz gibi NuGet’in kullanımı da oldukça kolay. Özellikle hızlı bir şekilde gelişmesi nedeniyle de çok daha farklı yeni özellikler kazanacağına eminim.

NuGet’i herkese tavsiye ederim. Hemen kurulumunu yapıp kullanmaya başlayın. Winking smile

Görüşmek Üzere,



Visual Studio 2010 Tips #9 - Highlighted References Özelliği

Merhaba Arkadaşlar, Bu yazımızda Visual Studio 2010 ile beraber gelen Highlighted References özelliğini inceleyeceğiz. Bu özellik ile bir dosya içerisinde bulunan bir değişkenin yada referansın kullanıldığı tüm yerleri çok kolay bir şekilde görebilmekteyiz. Kullanım olarak ise öncelikle dosya içerisinde kullanım yerlerini görmek istediğimiz değişken yada referansın üzerine tıklıyoruz ve biraz bekliyoruz. Daha sonra ise Visual Studio o nesne yada değişkenin dosya içerisinde kullanıldığı yerleri çerçeve içerisine alıyor ve böylece rahatlıkla kullanım yerlerini görebiliyoruz. Ayrıca Ctrl+Shift+Up yada Ctrl+Shift+Down tuşları ile bu kullanım örnekleri arasında dolaşabilmekteyiz.

Örneğin aşağıdaki örnekte metot içerisinde bulunan inc değişkenin kullanıldığı yerler çerçeve içerisine alınmıştır.

    Görüşmek Üzere,


Visual Studio 2010 Tips #10 - Kodun İstenilen Kısımdan Görünmez Hale Getirilmesi (Hide Selection)

Merhaba Arkadaşlar,

Visual Studio 2010 Tips yazı serimizin 10. yazısında kaynak kodların istenilen kısmından kapatılabilmesi özelliğini inceliyor olacağız. Daha önceki Visual Studio sürümlerine baktığımızda kodlarımızı sadece belirli noktalardan kapatabiliyorduk. (Namespaceler, metot tanımları vs..). Örneğin sadece bir if bloğunu kapatmamız mümkün değildi. Ancak Visual Studio 2010 ile beraber artık bu da mümkün hale gelmiş durumda. İstediğimiz kod bloğunu görünmez duruma getirmek için kodu seçip sağ tıkla Outlining->Hide Selection tıklayarak kodu istediğimiz kısımdan görünmez yapabilmekteyiz.

Yada kısayol olarak Ctrl+M Ctrl+H kullanabilmekteyiz. Kodu yeniden eski konumuna getirmemiz için kod üzerine sağ tık Outlining->Stop Hiding Content yapmamız yeterli. Görüşmek Üzere,


Visual Studio 2010 RC WCF Servis Referansı Eklerken Collection Tipi Olarak ObservableCollection'ın Bulunmaması Problemi

Merhaba Arkadaşlar,

Geçtiğimiz günlerde Silverlight 4 RC'nin çıkmasıyla beraber bitirme projemi de Visual Studio 2010 RC ve SL 4 RC üzerine geçirdim. Tam sorunsuz bir şekilde çalışırken WCF servisime ve SL tarafındaki servis referansını update ettim. Bir önceki Beta versiyonunda servis referansını update ederken sürekli hata alıyordum hatta bazen VS'yi kapatıp açmam bile gerekebiliyordu. Tam bu sorunların düzeldiğini düşünürken çok ilginç bir şeyle karşılaştım.

Servis referansında collectionların çevirileceği tipin Custom olduğu yazılıyordu. Bu nedenle projemde haliyle pekçok hata aldım. Sorunu biraz araştırdığımda bir bug ile karşı karşıya olduğumu anladım ve kolay bir çözüm yolu buldum ve sizinle paylaşacağım.

Çözümü

Öncelikle Collection Type olarak Custom değil başka herhangi bir tipi seçmemiz gerekmekte. Örneğin System.Collections.ObjectModel.Collection olabilir. Daha sonra Solution Explorer içerisinden Show All Files seçeneğine tıklıyoruz ve Service Reference altındaki Reference.svcmap altındaki Reference.cs veya Reference.vb dosyasını açıyoruz. Son olarak bu dosya içerisindeki başlangıçta collection tipini System.Collections.ObjectModel.ObservableCollection olarak değiştiriyoruz.

Daha sonra uygulamayı derlediğimiz zaman uygulamamızdaki collectionlar yine sorunsuz bir şekilde ObservableCollection'a çevirilecektir. Bu sorunla ilgili kararlı sürümden önce bir patch çıkarılıp çıkarılmayacağı ile ilgili bir bilgi verilmiyor. Ancak release tarihinin de oldukça yaklaşmasından dolayı herhangi bir patch çıkarılması çokta olası görünmüyor. Ancak sorun release sürümünde tamamen giderilmiş.



Visual Studio 2010 Tips #11 - Yaratılan Projelerin Varsayılan Lokasyonlarının Değiştirilmesi

Merhaba Arkadaşlar, Eminim ki çoğumuz Visual Studio'nuzu açtıktan sonra yeni bir proje yaratırken projenin yer alacağı klasörün uzantısını her zaman değiştiriyoruz. Örneğin ben genelde TestProjects isimli bir klasör içerisinde tüm test amaçlı açtığım projelerimi topluyorum ve bu projelerin karışık lokasyonlarda bulunmasının önüne geçiyorum. Ancak her seferinde bu projeleri yaratırken klasör lokasyonunu değiştirmek bizim için can sıkıcı bir durum alabiliyor. Bunun yerine projelerin yaratılacağı klasörü varsayılan olarak bir yerden belirlesek nasıl olurdu ?Wink Bence süper olurdu. O zaman gelin yaratılan proje lokasyonun varsayılan olarak yeni bir değere atayalım. Bunun için Tools=>Options ekranına geliyoruz. Daha sonra ise sol taraftan Projects &Solutions'a tıklayarak ekrana gelen Projects Location'ı değiştiriyoruz. Böylece artık yaratılan projelere varsayılan olarak o lokasyonda yaratılacak.     

Bundan sonra artık yarattığımız projelerin lokasyonu varsayılan olarak verdiğimiz değere eşit olacak.

Görüşmek Üzere,


Visual Studio 2010 Tips #12 - Yaratılan Projelerin Otomatik Olarak Kaydedilmemesi

Merhaba Arkadaşlar, Visual Studio ile yarattığımız projeleri her zaman kaydetmek zorunda oluyoruz. En azında varsayılan olarak. Smile Ancak yapacağımız ufak bir ayar ile artık projeleri yarattığımız sırada bilgisayarda belirli bir lokasyona kaydedilmesi zorunluluğunu ortadan kaldırabiliyoruz. Bunun için öncelikle Tools => Options menüsüne giriyoruz. Daha sonra sol taraftan Projects and Solutions seçeneğine tıklıyoruz. Son olarak ise karşımıza gelen ekrandaki Save new projects when created seçeneğini seçili durumdan kaldırıyoruz.     Böylece artık yeni bir proje yarattığımızda proje otomatik olarak kayıt edilmeyecek ancak uygulamayı kapatırken bize üzerinde çalıştığımız uygulamayı kaydetmek isteyip istemediğimiz sorulacaktır. Görüşmek Üzere,


Visual Studio 2010 Tips #13 - Intellisense Suggestion Mode

Merhaba Arkadaşlar,

Bu yazımızda Visual Studio 2010 ile beraber gelen Intellisense Suggestion Modu inceliyor olacağız. Genelde testlerimizi yazarken önce yaratmak istediğimiz sınıfları test içerisinde tanımlar ve daha sonra CTRL+ . kısayolunu kullanarak bu sınıfı ilgili dosya içerisinde yaratırız. Ancak genelde sınıfımızın ilk kısmını yazarken Intellisense bize bir öneride bulunur ve aslında yaratmak istedğimiz sınıfı yazmamız bu durumda zorlaşır. Örneğin UrunTest sınıfı içerisinden Urun nesnesi yaratmaya çalışalım.

   

Gördüğümüz gibi Intellisense bize UrunTest sınıfını öneriyor. Oysaki biz Urun sınıfını yaratmak istiyoruz. İşte bu nedenden dolayı Visual Studio 2010 ile beraber gelen Intellisense Suggestion Modu kullanmamız gerekiyor. Böylece Intellisense yine bize öneride bulunuyor ancak ilk öneri bizim yazdığımız oluyor. Diğer seçenekleri seçmek için aşağı ve yukarı oklarını kullanmamız gerekiyor.

  Bu arada unutmadan Intellisense Suggestion Moda CTRL+ALT+Space ile geçebiliyoruz. Smile Görüşmek Üzere,


Visual Studio 2010 Tips #14 - Box Selection

Merhaba Arkadaşlar,

Bu yazımızda bence Visual Studio içerisinde bulunan en güzel özelliklerden biri olan Box Selection özelliğinden bahsediyor olacağız. Box selection özelliği ile beraber artık kodlarımızı bir kutu gibi seçebiliyoruz. Ayrıca bu özelliğin en güzel yanlarından birisi de kutu içerisinde bulunan tüm satırlarda birer cursorın olması. Böylece toplu olarak seçilen satırlara bir kod eklemek istediğimiz zaman ilgili kodu sadece 1 kere yazmamız yeterli oluyor. Peki Box Selection'ı nasıl kullanıyoruz gelin hep beraber inceleyelim. Demo olması amacıyla 2 tane private değişkenimiz olduğunu düşünelim ve bu değişkenleri toplu bir şekilde nasıl public yapabiliriz bu konuyu incelemeye çalışalım.

Şimdi private olan kısımları ALT tuşuna basılı tutarak mouse kullanarak seçiyoruz.

Daha sonra klavye ile public yazarsak seçtiğimiz tüm satırlara yazdıklarımız doğrudan yansıtılacaktır.

Özellikle değişkenlerin veya propertylerin tiplerini değiştirirken yada toplu olarak bir değişiklik yapmamız gerektiği zamanlarda bu özelliğin oldukça faydalı olacağını düşünüyorum. Smile

Görüşmek Üzere,