Bir önceki makalemizde bir Add-in projesi nasıl yaratılır, ve Add-in projesinde .Net IDE’sine menüler nasıl eklenir, ona değinmiştik. Bu makalemizde de, IDE içerisindeki solution’un tüm itemlarına nasıl erişebileceğimize ve bu itemlara nasıl eklentiler yapabileceğimize değineceğiz.
.Net’in Code modeli sayesinde bir solutiondaki bütün projelere, bu projelerin sınıflarına ve sınıfların içerisindeki propertylerine ve fonksiyonlarına erişilebilir. Aynı zamanda yeni bir sınıf eklenebilir, eklenen yeni sınıflara namespace, import statementleri, değişkenler veya fonksiyonlar gibi birçok kod parçası eklenebilir. Aynı zamanda var olan kodlar üzerinde de değişiklikler yapılabilir.
Solution explorerdaki Herbir Itema Erişim1. IDE’ye Erişim
Açtığımız .NET IDE’sinin instance’ı Add-in projesi içerisindeki OnConnection methoduna geçen ilk parametredir.
public void OnConnection(object application, ..........
Bu parametre OnConnection metodu içerisinde genel bir property’e set edilerek class seviyesinden erişilir hale gelmektedir.
_applicationObject = (DTE2)application;
“_applicationObject” nesnesi artık bizim için aktif olan IDE’nin instance’nı göstermektedir.
2. Solution’a Erişim
“_applicationObject” nesnesinin, solution property’sinden solutiona aşağıdaki gibi erişilebilir.
Solution2 soln = (Solution2)_applicationObject.Solution;
3. Projelere Erişim
Solution içerisindeki her bir projeye, solution nesnesinin Projects propertysinde dönülerek erişilir.
foreach (Project project in soln.Projects){}
Her bir “project” nesnesi, Project tipinde olup solution içerisindeki projelere denk gelmektedir.
Her bir “project” nesnesi, Project tipinde olup solution içerisindeki projelere denk gelmektedir.
4. Proje İçerisindeki Itemlara Erişim
Proje içerisindeki herhangi bir klasör, text dosya,image vb. şeylere erişim için aşağıdaki gibi bir döngü kullanılabilir.
foreach (ProjectItem item in prjItem.ProjectItems) {}
Eğer proje içerisindeki bütün sınıf yapılarına (class’lara) erişilecekse, aşağıdaki örnekte olduğu gibi projenin CodeModel property’si üzerinde gidilerek CodeElementlere erişilebilir.
CodeModel codemodel = project.CodeModel;
if (codemodel == null) return null;
CodeElements elements = codemodel.CodeElements;
var elems = elements.OfType<CodeElement>().Where(c => c.Kind == vsCMElement.vsCMElementClass).Select(x => x.Name).Distinct().ToArray();
Bir Projeye Namespace, Class , Method Eklemeif (codemodel == null) return null;
CodeElements elements = codemodel.CodeElements;
var elems = elements.OfType<CodeElement>().Where(c => c.Kind == vsCMElement.vsCMElementClass).Select(x => x.Name).Distinct().ToArray();
1. Namespace Ekleme
Aşağıdaki örnek, “project” adındaki projeye “Deneme.cs” adında bir kod dosyası, bu kod dosyasına da “Ornek.DenemeNameSpace” adında bir namespace eklemektedir.
CodeNamespace nameSpace = project.CodeModel.AddNamespace(@"Ornek.DenemeNameSpace",@"C:\Ornek\Deneme.cs",0);
“AddNameSpace” methodunun ilk parametresi namespace adını, ikinci parametresi kod dosyasının dosya yolunu, üçüncü parametresi kod dosyası içerisindeki yerini belirtir.
2. Class Ekleme
Aşağıdaki örnek, “nameSpace” adındaki namespace’e “Deneme” adında bir sınıf eklemektedir.
CodeClass2 c = (CodeClass2)nameSpace.AddClass("Deneme", 0, null, null, vsCMAccess.vsCMAccessPublic);
“AddClass” metodunun ilk parametresi sınıfın adını, ikinci parametresi eklendiği kapsamdaki yerini, üçüncü parametresi alt sınıf adını, dördüncü parametre implement ettiği interface adını, beşinci parametre sınıfın erişim tipini belirtir.
3. Method Ekleme
Aşağıdaki örnekte, “cls” adındaki sınıfa “Topla” adında bir metod eklenmiştir. Bu metodun dönüş tipi integer olarak, metoda erişim tipi ise public olarak verilmiştir.
“AddFunction” metodunun ilk parametresi fonksiyonun adını, ikinci parametresi fonksiyonun tipini, üçüncü parametresi metodun dönüş tipini, dördüncü parametresi eklendiği kapsamdaki yerini, beşinci parametre metodun erişim tipini belirtir.
CodeFunction2 func = (CodeFunction2)cls.AddFunction("Topla", vsCMFunction.vsCMFunctionFunction, vsCMTypeRef.vsCMTypeRefInt, -1, vsCMAccess.vsCMAccessPublic, null);
EditPoint2 editPoint = (EditPoint2) func.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint();
editPoint.Indent(null, 0);
editPoint.Insert("int x=5;");
editPoint.Indent(null, 0);
editPoint.Insert("int x=8;");
editPoint.Indent(null, 0);
editPoint.Insert("return x+y;");
EditPoint2 editPoint = (EditPoint2) func.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint();
editPoint.Indent(null, 0);
editPoint.Insert("int x=5;");
editPoint.Indent(null, 0);
editPoint.Insert("int x=8;");
editPoint.Indent(null, 0);
editPoint.Insert("return x+y;");
Eğer fonksiyonun içeriğini eklemek istersek, GetStartPoint metodu ile fonksiyonun gövdesinin ilk başlangıcı alınır. Ve editPoint nesnesinin Insert metodu ile eklenmek istenen kod satırları eklenir.Indent fonksiyonu ile de girinti vererek yazdığımız kodu satır başından sonra istediğimiz kadar içeriden başlatabiliriz.
Özlem KARAGEDİK, Armağan DÖKER
Yorumlar
Yorum Gönder