Makale Özeti

Bu makalemde sizlerle birlikte uygulama geliştirirken visual studio'ya nasıl add-in yazabileceğimizi inceleyeceğiz. Uygulama geliştirirken zaman kazanmak için veya bilgi kaynağı olarak kullandığınız bazı araçları Visual studio ya add-in yazarak daha rahat erişilebilir hale getirebileceğiniz gibi, kullandığınız bug veya proje yönetim araçlarınıda visual studio içinde bir panelde görebilirsiniz. Makalenin sonunda paylaşacağım bir uygulamamda bir rss in visual studio içinden kullanılabildiğini göreceksiniz.

Makale

Merhabalar,

Makalemin birinci kısmında anlattığım teorik bilgiyi pratiğe dökmeye başlayalım. Her programda olduğu gibi örnek olarak HelloWorld uygulamasıyla başlayalım. MessageBox.Show metodunu kullanabilmeniz için System.Windows.Forms referansını eklemeniz gerekmektedir.

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
      _applicationObject = (DTE2)application;
      _addInInstance = (AddIn)addInInst;
      MessageBox
.Show("Hello Visual Studio");
}

public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
{
      MessageBox.Show("Goodbye Visual Studio");
}


Uygulamamızın kodunu yukarıda gibi yazıp F5'e basarak veya menü'den çalıştırdığımızda Visual Studio yazdığımız add-in enable edilmiş bir şekilde açılır.
 

Visual Studio açılırken yukarıdaki gibi bir mesaj çıkacağı gibi kapanırken de GoodBye Visual Studio mesajı çıkacaktır.

Connect.cs class'ı içerisinde yapabileceğimiz işlemler hakkında bir sınırlama yoktur. İsterseniz Add'in projesine bir Windows Form ekleyip. Bu formun instance'ını alarak çalışmasını sağlayabilirsiniz.

Ancak normal bir şekilde açılan form Visual Studio içerisinde şık gözükmeyecektir. Visual studio içerisinde kendi yapısında Dock edilebilir paneller oluşturmak için yapmanız gereken bu panel içerisinde göstermek istediğiniz kontrollerin bir Form olarak değil bir UserControl olarak bulunmasıdır. Bu şekilde kullanım ile ilgili örnek bir kod yazalım.

 

:
Şekildeki gibi bir UserControl oluşturuyoruz ve button'un click eventına Hello world şeklinde mesaj gösterecek kodu yazıyoruz. Şimdi sıra add-in'in içerisinde bu UserControl'un bir panel olarak gösterilmesini sağlamak için gerekli kodu yazalım.
 

public void OnStartupComplete(ref Array custom)
{
EnvDTE80.Windows2 win2;
AddIn addin;
object uc = null;

addin = _applicationObject.AddIns.Item(1);
win2 = (Windows2)_applicationObject.Windows;

string assemblyPath = Assembly.GetExecutingAssembly().Location;
string className = "VsAddinim.MyUserControl";
string guid = "{426E8D27-3D33-4fb8-B3E9-9883AA1C679F}";
string caption = "Addinim Panel Icince";

Window pnlWin;
pnlWin = win2.CreateToolWindow2(addin, assemblyPath, className, caption, guid, ref uc);
pnlWin.Visible = true;
pnlWin.Activate();
}


Kodu açıklayacak olursak Öncelikle Visual Studio'yu temsil eden Windows2 nesnesi ve add-in'imizi temsil eden bir Addin nesnesini ve usercontrol'ümüzü temsil edecek bir nesneyi object tipinden tanımlıyoruz. Sonrasında ise addin ve win2 değişkenlerine Visual Studio'nun ve addinimizin referanslarını atıyoruz. Şimdi ise sıra açılacak olan pencerenin özelliklerini tanımlamaya geldi.Burada assemblyPath UserControl'umuzun bulunduğu assembly'nin yolunu temsil etmektedir. UserControl'ümüz aynı assembly içerisinde yer aldığından Assembly.GetExecutingAssembly().Location ile bu bilgiye ulaşabiliriz. Başka bir lokasyonda olması durumunda ise path'i el ile verebilirdik. className değişkenine ise açmak istediğimiz nesnenin FullName'ini veriyoruz. guid uygulamamızda kullanacağımız her add'in için farklı bir değer olmak zorundadır. Aynı guid'de farklı iki add-in olamaz. Ve panelin başlığında gözükecek yazıyıda tanımladıktan sonra bu değerleri Windows2 nesnesinin CreateToolWindow2 metoduna göndererek yeni bir panel oluşmasını sağlıyoruz. Daha sonra bu paneli kullancılara gösterecek kodu yazıyoruz.Çalıştırdığımızda ise aşağıdaki gibi bir görüntü ile karşılaşıyoruz.

Şimdi ise Menü'ye add-inimizi nasıl ekleyebileceğimizi inceleyelim.
 

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
      object []contextGUIDS = new object[] { };
      Commands2 commands = (Commands2)_applicationObject.Commands;
      string toolsMenuName; 
      try
      {
            ResourceManager resourceManager = new ResourceManager("MyAddin3.CommandBar", Assembly.GetExecutingAssembly());
            CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
            string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
            toolsMenuName = resourceManager.GetString(resourceName);
      }
      catch
      {
            toolsMenuName = "Tools";
      }
      Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];
     
CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
      CommandBarPopup
toolsPopup = (CommandBarPopup)toolsControl;
     
try
      {
            Command command = commands.AddNamedCommand2(_addInInstance, "MyAddin3", "MyAddin3", "Executes the command for MyAddin3", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
            if((command != null) && (toolsPopup != null))
            {
                  command.AddControl(toolsPopup.CommandBar, 1);
            }
      }
      catch(System.ArgumentException)
      {
            //mesaj goster
      }
}
}

 

Visual Studio menüsüne item oluşturmak için öncelikle Hangi menü altına oluşturacağımızı bulmamız gerekiyor. Bu örnekte tools menüsü altına oluşturacağımızda Tools menüsünün adını uygulamanın diline göre resx dosyasından okuyoruz. Daha sonra ise CommandBarımızı bulduktan sonra AddNamedCommand metodu ile menüye istediğimiz item'ı ekliyoruz ve aşağıdaki gibi görebiliyoruz.

Peki bu Menüye tıklanıldığında bir işlem yapabilmemiz için hangi metodu kullanmamız gerek. Şimdi bunu inceleyelim.

Bunun için wizard da uygun seçeneği seçerseniz Connect classının IDTCommandTarger interface'ini de implement ettiğini göreceksiniz. Şimdi bu interface ile gelen metodlara bakalım.

QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText) : Çalıştırılabilecek command'ın uygunluk durumunun değiştirildiği anlarda çalışan bu metod sayesinde command'ın durumunu değiştirebilirsiniz.

Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) : Bu metod sayesinde çalışmış herhangi bir commandı yakalayabilirsiniz. commandName çalışmakta olan commandın ismini verir.Buna göre farklı şekilde davranmak mümkündür.

Ayrıca aktif olan döküman bilgilerine ulaşmak isterseniz _applicationObject.ActiveDocument nesnesini kullanabilirsiniz. Window ve Application nesnelerinizi user control içerisine geçirmek için bir statik değişken tanımlamanız ve oradan kullanmanız gerekiyor.

Şimdiye kadar anlattıklarımı pekiştirmek adına Blogumdaki Rss feedlerini alıp gösteren bir add-in yazalım.

 Bunun için öncelikle Rss Feed'indeki verileri alarak UserControl içerisindeki bir datatable içerisinde gösterecek kodu yazalım.
 

public MyUserControl()
{
      InitializeComponent();
      DataSet
ds = new DataSet();
      ds.ReadXml("http://www.tameroz.com/Rss/RssBlog.ashx?LanguageId=1");
      dgvBlog.AutoGenerateColumns = false;
      dgvBlog.DataSource = ds.Tables[2];
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
      Process
.Start(((DataTable)dgvBlog.DataSource).Rows[e.RowIndex]["link"].ToString());
}


Bu kısımdan sonrası bu kısmın visual studio açılırken gösterilmesinden ibarettir. Bunun nasıl yapıldığını zaten inceledik. Uygulamamız bittiğinde aşağıdaki gibi bir görünümü olacaktır.



Bu teknoloji ile Visual Studio'ya yazavileceğiniz add-in lerin tek sınırı hayal gücünüz. Umarım faydakı olmuştur.

Tamer Öz
         oztamer@hotmail.com
         tamer.oz@yazgelistir.com
         oztamer@hotmail.com