Aracılığıyla paylaş


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.

tz746te4.collapse_all(tr-tr,VS.110).gifVisual 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.

tz746te4.collapse_all(tr-tr,VS.110).gifDescription

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.

tz746te4.collapse_all(tr-tr,VS.110).gifKod

' 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.)

tz746te4.collapse_all(tr-tr,VS.110).gifDescription

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.

tz746te4.collapse_all(tr-tr,VS.110).gifKod

[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

Visual C++ kod modeli

Otomasyon nesne modeli şeması

Visual C++ kod modeli

Diğer Kaynaklar

Oluşturma ve ortam Windows denetleme

Eklentiler ve sihirbazlar oluşturma

Otomasyon ve Genişletilebilirlik Başvurusu