Kod modeli (Visual Basic) kullanarak kod keşfetme
Visual Studio Kod modeli Otomasyon istemcileri projesindeki kodu tanımları keşfedin ve bu kodu öğeleri değiştirme olanağı sunar. Kod Düzenleyicisi'nde değişiklikler yapıldığında kod modeli başvurulan tüm nesneler otomatik olarak güncelleştirir. Örneğin, bir sınıf nesnesi başvurusu ve bir kullanıcı daha sonra yeni bir işlev ekler, onu üyeleri arasında listelenir. Kod modeli uygulamak için bir Ayrıştırıcı önlemek Otomasyon istemcilerin Visual Studio bir projede, sınıflar, arabirimleri, yapıları, yöntemleri, özellikleri ve benzerleri gibi üst düzey tanımlamalar keşfetmek için diller.
Visual Studio Çekirdek kod modelinin kodu alanlarının dile özgü önler, yok Bu yüzden Örneğin, işlev ifadelerine bir nesne modeli sağlar veya parametreleri tam ayrıntıları verin. Parametreler, türü ve parametrenin adı yalnızca kod modeli sunar ve ilgili olup, çıkış, giriş parametresi hiçbir bilgi isteğe bağlıdır ve diğerleri sağlanmamıştır. Visual C++doğrultusunda hedeflenen çekirdek kod modeli genişletilmiş bir sürümünü sunar Visual C++ projeleri. Bu konuda daha fazla bilgi için bkz: Visual C++ kod modeli.
İnceleme ve kodu kod modeli ile düzenleme
Program veya kod projesinde metin dosyalarında depolanır, öncelikle metin tabanlı kod modeli. Her proje öğesi ziyaret etmek için Proje modelini kullanarak projenin kodunu bulmak ve proje öðesi kullanarak kod içerip içermediğini kontrol edin FileCodeModel. Proje öğesi kod öðesi içeriyorsa, bu öğeleri Düzenleyici'den nesneleri dönebilirsiniz ve kod modeli kodu değiştirin veya yerelleştirilmiş ayrıştırma gerçekleştirmek için metin düzenleyici otomasyon modelini kullanabilirsiniz. Düzenleyici nesne modelini kullanarak, düzenleyenin ekleme noktasını içeren kod öğesi isteyebilir veya bir TextPoint nesne işlev veya sınıf düzeyinde.
Birincil giriş noktasına Visual Studio çekirdek kod modeli CodeModel nesne. Genel CodeElements koleksiyonu, kod modeli çeşitli bölümlerinde kullanılır. Bir anda CodeElements düzeyde ve bu nesneler üyeleri verir sınıf veya arabirim düzeyi. Her öğe, bir CodeElements koleksiyonu bir CodeElement2 nesnesi ve her CodeElement2 nesne olan bir Kind bir sınıf, arabirim, yapı, işlev, özellik, değişken ve vb. olup kendi türünü tanımlayan özellik.
Dile özgü kod modelleri
Visual C++Hedef için çekirdek kod modeli uzantısı sağlar Visual C++-belirli bir kod. Örneğin, Languageverilen kod öğesi olduğunu gösterir bir Visual C++ kod modeli nesnesi ve Kind = vsCMElementClass, CodeClass için ya da QueryInterface (QI için) seçin Visual Studio kod modeli veya VCCodeClass QI Visual C++ dile özgü kod modeli. Daha fazla bilgi için Visual C++-belirli kod modeli bkz: Nasıl yapılır: Visual C++ kod modeli (Visual Basic) kullanarak kod değiştirme ve Visual C++ kod modeli.
Visual Studio çekirdek kod modeli notları
Yalnızca Visual C++ kod modeli uygulaması Microsoft dil uygulamaları, dile özgü modelleme yapar.
Bazı diller uygulamaları tüm uygulamayan Visual Studio kod modeli. Bunlar olduğunda özel durumlar dışında Yardım konuları üzerine gelin. Kod modeli uygulamaları arasında birçok farklar, diller arasında işlevsel farklılıklar üzeresiniz. İşlevler için örneğin, ekleyemezsiniz CodeNamespace veritabanındaki nesneler Visual Basic veya Visual C# çünkü yalnızca Visual C++ üst düzey işlev tanımlarını içerir.
Description
Bu eklenti ile çeşitli kod öðelerinin izlenecek bir Visual Studio dosyası. Örneği çalıştırmak için dosya içinde açık bir kaynak koduna sahip Visual Studio Kod Düzenleyicisi. Örnekleri çalıştırma hakkında daha fazla bilgi için bkz: Nasıl yapılır: derlemek ve Otomasyon nesne modeli kod örneklerini çalıştırmak.
Kod
' Add-in code.
Public Sub OnConnection(ByVal application As Object, ByVal _
connectMode As ext_ConnectMode, ByVal addInInst As Object, _
ByRef custom As Array) Implements IDTExtensibility2.OnConnection
_applicationObject = CType(application, DTE2)
_addInInstance = CType(addInInst, AddIn)
' Pass the applicationObject member variable to the code example.
OutlineCode(_applicationObject)
End Sub
Sub OutlineCode(ByVal dte As DTE2)
Dim fileCM As FileCodeModel2 _
= CType(dte.ActiveDocument.ProjectItem.FileCodeModel, _
FileCodeModel2)
Dim elts As CodeElements
elts = fileCM.CodeElements
Dim elt As CodeElement2
Dim i As Integer
MsgBox("About to walk top-level elements ...")
For i = 1 To fileCM.CodeElements.Count
elt = CType(elts.Item(i), CodeElement2)
CollapseElt(elt, elts, i)
Next
End Sub
Sub CollapseElt(ByVal elt As CodeElement2, ByVal elts As _
CodeElements, ByVal loc As Long)
Dim epStart As EditPoint2
Dim epEnd As EditPoint2
epStart = CType(elt.StartPoint.CreateEditPoint, EditPoint2)
' Do this since we move it later.
epEnd = CType(elt.EndPoint.CreateEditPoint, EditPoint2)
epStart.EndOfLine()
If ((elt.IsCodeType) And (elt.Kind <> _
vsCMElement.vsCMElementDelegate)) Then
MsgBox("Got type but not a delegate, named : " & elt.Name)
Dim ct As CodeType
ct = CType(elt, CodeType)
Dim mems As CodeElements
mems = ct.Members
MsgBox("Set mems = ct.members")
Dim i As Integer
For i = 1 To ct.Members.Count
CollapseElt(CType(mems.Item(i), CodeElement2), mems, i)
Next
ElseIf (elt.Kind = vsCMElement.vsCMElementNamespace) Then
MsgBox("Got a namespace, named: " & elt.Name)
Dim cns As CodeNamespace
cns = CType(elt, CodeNamespace)
MsgBox("set cns = elt, named: " & cns.Name)
Dim mems_vb As CodeElements
mems_vb = cns.Members
MsgBox("Got cns.members")
Dim i As Integer
For i = 1 To cns.Members.Count
CollapseElt(CType(mems_vb.Item(i), CodeElement2), _
mems_vb, i)
Next
End If
End Sub
Kod modeli öğe değerlerini değiştirebilirsiniz
Belirli türdeki düzenlemeleri yaptıktan sonra sınıflar, yapılar, İşlevler, öznitelikleri, Temsilciler ve diğerleri, gibi kod modeli öğeler atanan değerleri değişebilir. Sonuç olarak, değerler statik kalır varsayamazsınız.
Daha sonra başvuru yaptığınızda, kod modeli öğesi yerel bir değişkene örneğin atayın ve sonra bu yerel bir değişken için bir özelliğin değerini ayarlamak, yerel değişken geçerli kod modeli öğesinin içermeyebilir. Aslında, farklı kod modeli öğe bile içerebilir.
"İçin atanan MyFunction" adında bir işlev içeren bir sınıf düşünün bir CodeFunction değişken ve Name özelliği CodeFunction "YourFunction" değerine ayarlayın Değişken bu atamadan sonra artık yerel değişkeniniz aynı gösteren garanti CodeFunction. Bundan sonra özellik değerinin erişme E_FAIL sonuç olarak döndürebilir.
Açıkça yerel değişkeniniz doğru kod modeli öğe için özellik değerlerini erişmeden önce yeniden atamak için bu durumla ilgili önerilen yaklaşım olur. Bunun nasıl yapılacağı örneği gösterir. (Kod eklenti biçimindedir.)
Description
Bu eklenti, böylece uygun değer alınır CodeElements için erişim değerlere doğru şekilde gösterilmiştir. Örnekleri çalıştırma hakkında daha fazla bilgi için bkz: Nasıl yapılır: derlemek ve Otomasyon nesne modeli kod örneklerini çalıştırmak.
Kod
[Visual Basic]
Public Sub OnConnection(ByVal application As Object, ByVal _
connectMode As ext_ConnectMode, ByVal addInInst As Object, _
ByRef custom As Array) Implements IDTExtensibility2.OnConnection
_applicationObject = CType(application, DTE2)
_addInInstance = CType(addInInst, AddIn)
ReassignValue(_applicationObject)
End Sub
Sub ReassignValue(ByVal dte As DTE2)
' Before running, create a new Windows application project,
' and then add a function to it named MyFunction.
Try
Dim myFCM As FileCodeModel = _
dte.ActiveDocument.ProjectItem.FileCodeModel
' Change the MyFunction name in Form1 class to
' the name, OtherFunction.
Dim myClass1 As CodeClass = _
CType(myFCM.CodeElements.Item("Form1"), CodeClass2)
Dim myFunction As CodeFunction = _
CType(myClass1.Members.Item("MyFunction"), CodeFunction2)
myFunction.Name = "OtherFunction"
myFunction = CType(myClass1.Members.Item("OtherFunction"), _
CodeFunction2)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
[C#]
public void OnConnection(object application, ext_ConnectMode
connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
ReassignValue(_applicationObject);
}
// Before running, create a new Windows application project,
// and then add a function to it named MyFunction.
public void ReassignValue(DTE2 dte)
{
try
{
FileCodeModel myFCM =
dte.ActiveDocument.ProjectItem.FileCodeModel;
// Change the MyFunction name in Form1 class to
// the name, OtherFunction.
CodeClass myClass1 =
(CodeClass2)myFCM.CodeElements.Item("Form1");
CodeFunction myFunction =
(CodeFunction2)myClass1.Members.Item("MyFunction");
myFunction.Name = "OtherFunction";
myFunction =
(CodeFunction2)myClass1.Members.Item("OtherFunction");
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
Not
Kod modeli öğenin alt öğelerini özelliklerini ayarlayarak bu davranışlar değil.Doğrudan etkileyen özelliklerini CodeElement — bir yöntem imzası işlevi türü öğesinin adı gibi vb..— Bu kesin olmayan bir davranış sergiler.
Ayrıca, bu örnek yalnızca çalışır yeni adı CodeElement eşdeğerleri arasında benzersizdir.Bu, çünkü Item özelliği, aşırı yüklenmiş yöntemler veya özellikler, kısmi sınıflara veya ad aynı adı taşıyan çalışmaz ilk eşleşme döndürür.
Ayrıca bkz.
Görevler
Nasıl yapılır: derleme kod örneği için Visual C++ kod modeli genişletilebilirlik
Nasıl yapılır: bir eklenti oluşturmak
İzlenecek yol: bir sihirbaz oluşturma
Nasıl yapılır: Visual C++ kod modeli (Visual C#) kullanarak kod değiştirme
Kavramlar
Kod modeli (Visual C#) kullanarak kod keşfetme
Diğer Kaynaklar
Oluşturma ve ortam Windows denetleme