Aracılığıyla paylaş


Kod Modeli Kullanarak Kodu Keşfetme (Visual Basic)

Visual Studio eklentileri, Visual Studio 2013'te kullanım dışıdır.Eklentilerinizi VSPackage uzantılarına yükseltmelisiniz.Yükseltme hakkında daha fazla bilgi için bkz: SSS: Eklentileri VSPackage Uzantılarına Dönüştürme.

Visual Studio kod modeli, otomasyon istemcilerine, bir projedeki kod tanımlarını keşfetme ve bu kod öğelerini değiştirme olanağı sağlar.Kod modeli, kod düzenleyicisinde değişiklik yapıldığında başvurulan tüm nesneleri otomatik olarak güncelleştirir.Örneğin, bir sınıf nesnesine başvurursanız ve bir kullanıcı daha sonra yeni bir işlev eklerse, bu işlev üyeler arasında listelenir.Kod modeli, otomasyon istemcilerinin, bir projedeki sınıf, arabirim, yapı, yöntem, özellik vb. üst düzey tanımları keşfetmek üzere Visual Studio dilleri için bir ayrıştırıcı uygulamaktan kaçınmasına izin verir.

Visual Studio çekirdek kod modeli, kodun dile özel alanları önler, bu yüzden, örneğin, işlevlerde belirtimler için bir nesne modeli sağlamaz veya parametrelerin tam ayrıntılarını vermez.Parametreler için, kod modeli yalnızca parametrenin türünü ve adını gösterir ve parametrenin giriş, çıkış, isteğe bağlı vb. olup olmadığına yönelik herhangi bir bilgi sağlanmaz.Visual C++, Visual C++ projelerini amaçlayan genişletilmiş çekirdik kod modelleri sunar.Bunun hakkında daha fazla bilgi için bkz. Visual C++ Kod Modeli.

Kod Modeli ile Kod İnceleme ve Düzenleme

Kod modeli, projedeki kod metin dosyalarında depolandığında öncelikli olarak metin tabanlıdır.Bir projenin kodunu, her bir proje öğesini ziyaret etmek üzere proje modelini kullanarak bulabilirsiniz ve ardından FileCodeModel kullanarak proje öğesinin kodu içerip içermediğini görmek üzere kontrol edebilirsiniz.Proje öğesi kod öğelerini içeriyorsa, bu öğeler düzenleyicideki nesneleri döndürebilir ve kod modeli de kodu değiştirmek ve yerelleştirilmiş ayrıştırma gerçekleştirmek için metin düzenleyiciyi kullanabilir.Düzenleyici nesne modeli kullanarak, düzenleyenin ekleme noktasını içeren kod öğesi veya işlev ya da sınıf düzeyinde bir TextPoint nesnesi isteyebilirsiniz.

Visual Studio çekirdek kod modeline birincil giriş noktası CodeModel nesnesidir.Genel CodeElements koleksiyonu kod modelinde birçok yerde kullanılır.CodeElements düzeyinde ve sınıf veya arabirim düzeyinde, bu nesnelerin üyelerini getiren bir tane vardır.CodeElements koleksiyonunun her öğesi, bir CodeElement2 nesnesidir ve her CodeElement2 nesnesinin sınıf, arabirim, yapı, işlev, özellik, değişken ve diğerleri olup olmadığını tanımlayan bir Kind özelliği vardır.

Dile Özel Kod Modelleri

Visual C++, hedef kod modeline, Visual C++-belirli kodunu hedeflemek için bir uzantı sağlar.Örneğin, Language , verilen bir kod öğesinin Visual C++ kod model nesnesi ve Kind = vsCMElementClass olduğunu gösteriyorsa, Visual Studio kod modelinden CodeClass için QueryInterface (QI) öğesini veya Visual C++ dile özel kod modelinden VCCodeClass için QI öğesini seçebilirsiniz.Visual C++-özel kod modeli hakkında daha fazla bilgi için, bkz. Nasıl yapılır: Visual C++ Kod Modeli Kullanarak Kodu İşleme (Visual Basic) ve Visual C++ Kod Modeli.

Visual Studio Çekirdek Kodu Modeli Notları

  • Microsoft dil uygulamalarının dile özgü modellemesini yalnızca Visual C++ kod modeli uygulaması gerçekleştirir.

  • Bazı dillerin uygulamaları kod modelinin tamamını uygulamaz.Var olduklarından konuların özel durumları işaret etmesine yardımcı olur.Kod modeli uygulamaları arasındaki çoğu farklılığın nedeni diller arasındaki işlevsel farklılıklardır.Örneğin, yalnızca Visual C++ üst düzey işlev tanımlarına sahip olduğu için, Visual Basic veya Visual C# içinde bulunan CodeNamespace nesnelerine işlev ekleyemezsiniz.

Tanımlama

Bu eklenti, bir Visual Studio dosyasının çeşitli kod öğeleri içerisinde kılavuzluk eder.Örneği çalıştırmak için, Visual Studio kod düzenleyicisinde kaynak kodu dosyasını açmanız gerekir.Örnekleri çalıştırma hakkında daha fazla bilgi için, bkz. Nasıl yapılır: Otomasyon Nesne Modeli Kod Örnekleri Derleme ve Çalıştırma.

Code

' 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ğerleri Değişebilir

Kod modelinin sınıf, yapı, işlev, öznitelik, temsilci vb. öğelerinin atanan değerleri, yaptığınız belirli düzenlemelerden sonra değişebilir.Sonuç olarak, değerlerin statik kalacağını varsayamazsınız.

Örneğin, kod modeli öğesini yerel bir değişkene atarsanız ve bu yerel değişken için bir özellik değeri ayarlarsanız, daha sonra başvurduğunuzda yerel değişkende geçerli kod modeli öğesi bulunmayabilir.Aslında, farklı bir kod modeli öğe bile içerebilir.

CodeFunction değişkenine atanan "MyFunction" adında bir işlev içeren bir sınıfı kullanın, ardından CodeFunction öğesinin Name özelliği "YourFunction" değerine ayarlanır. Bu değişken atamasının ardından, yerel değişkeninizin artık aynı CodeFunction öğesini temsil edeceği kesin değildir.Bu yüzden özelliğin değerine erişmek sonuç olarak E_FAIL döndürebilir.

Bu durumla ilgilenmek üzere önerilen yaklaşım özellik değerlerine erişmeden önce doğru model öğesine yerel değişkeninizi açıkça yeniden atamaktır.Aşağıdaki bunun nasıl olduğu ile ilgili bir örnek gösterir. (Kod eklenti biçimindedir.)

Tanımlama

Bu eklenti, uygun değerin alınabilmesi adına, CodeElements için değerlere doğru şekilde erişme yöntemini gösterir.Örnekleri çalıştırma hakkında daha fazla bilgi için, bkz. Nasıl yapılır: Otomasyon Nesne Modeli Kod Örnekleri Derleme ve Çalıştırma.

Code

[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 öğenizin alt öğelerinin özelliklerini ayarlamak bu davranışı göstermez.Yalnızca CodeElement öğesini doğrudan etkileyen özellikler (öğenin adı, işlevin türü, yöntemin imzası gibi) bu kararlı olmayan davranışı gösterir.

Ayrıca bu örnek yalnızca CodeElement öğesinin yeni adı eşdüzey öğeleri arasında benzersizse çalışır.Bunun sebebi, Item özelliğinin, fazla yüklenmiş yöntemler/özellikler, parçalı sınıflar veya aynı adlı ad alanları için geçerli olmayan ilk eşleşmeyi getirmesidir.

Ayrıca bkz.

Görevler

Nasıl yapılır: Visual C++ Kod Modeli Genişletilebilirliği için Örnek Kod Derleme

Nasıl yapılır: Eklentiler Oluşturma

İzlenecek yol: Sihirbaz Oluşturma

Nasıl yapılır: Visual C++ Kod Modeli Kullanarak Kodu İşleme (Visual C#)

Kavramlar

Kod Modeli Kullanarak Kodu Keşfetme (Visual C#)

Visual C++ Kod Modeli

Otomasyon Nesne Modeli Grafiği

Visual C++ Kod Modeli

Diğer Kaynaklar

Ortam Pencereleri Oluşturma ve Denetleme

Eklentiler ve Sihirbazlar Oluşturma

Otomasyon ve Genişletilebilirlik Başvurusu