Sdílet prostřednictvím


Zjištění kódu pomocí kódu modelu (Visual Basic)

Visual Studio Modelu kódu umožňuje klientům automatizace Objevování definice kódů v projektu a změnit tyto prvky kódu.Kód modelu se automaticky aktualizuje všechny odkazované objekty při provádění změn v editoru kódu.Například odkaz objekt třídy a uživatel později přidává nové funkce, bude uveden mezi členy.Kód modelu umožňuje klientům automatizace vyhnout provádění analyzátor pro Visual Studio jazyky za účelem zjištění definice nejvyšší úrovně v projektu, třídy, rozhraní, struktury, metody, vlastnosti a podobně.

Visual Studio Modelu kódu jádra vyhýbá oblasti kód jazyka, tak Ne, například poskytuje objektový model pro výkazy ve funkcích nebo uveďte úplné informace o parametrech.Parametry modelu kódu zpřístupňuje pouze typ a název parametru a žádné informace je předpokladu o tom, zda parametr je vstup, výstup, volitelné a podobně.Visual C++nabízí rozšířenou verzi modelu jádra kódu, která bude zaměřena na Visual C++ projekty.Informace naleznete v tématu Model kódu Visual C++.

Přezkoumání a úpravy kódu modelu kódu

Modelu kódu je primárně založeno text že programu nebo kód v projektu je uložena v textových souborech.Najít kód projektu pomocí modelu projektu navštívit každé položky projektu a potom zkontrolujte, zda obsahuje položku projektu kód pomocí FileCodeModel.Pokud položku projektu obsahuje prvky kódu, tyto prvky vrátit z editoru objektů a modelu kódu pomocí textového editoru automatizace modelu upravovat kód nebo provést analýzu lokalizované.Pomocí objektového modelu editoru můžete požádat o prvek kódu obsahující kurzor v editoru nebo TextPoint na úrovni funkce nebo třídy objektu.

Primární vstupní bod do Visual Studio modelu kódu jádra je CodeModel objektu.Obecné CodeElements kolekce se používá v několika místech v modelu kódu.Je po jednom CodeElements úrovni a na úrovni třídy nebo rozhraní, která vrací členy těchto objektů.Každý prvek CodeElements kolekce je CodeElement2 objektu a každou CodeElement2 objekt má Kind vlastnost, která určuje jeho typ, zda je třída, rozhraní, struktura, funkce, vlastnosti, proměnné a tak dále.

Modely kód jazyka

Visual C++obsahuje rozšíření modelu kódu základní cíle Visual C++-určitý kód.Například pokud Languageoznačuje, že daný kód prvek Visual C++ objektu modelu kódu, a Kind = vsCMElementClass, pak můžete použít k buď funkce QueryInterface (QI) pro CodeClass z Visual Studio modelu kódu nebo QI pro z VCCodeClass Visual C++ modelu kódu jazyka.Další informace o Visual C++-kód pro konkrétní model, viz Jak: kód manipulovat pomocí modelu Visual C++ kódu (Visual Basic) a Model kódu Visual C++.

tz746te4.collapse_all(cs-cz,VS.110).gifPoznámky pro Visual Studio modelu kódu jádra

  • Pouze Visual C++ provádí implementaci modelu kódu jazyka modelování implementace jazyka Microsoft.

  • Některé jazyky implementace neimplementuje celý Visual Studio modelu kódu.Témata nápovědy ukázat výjimky, pokud existují.Většina rozdílů mezi implementací modelu kódu jsou kvůli funkční rozdíly mezi jazyky.Například nelze přidat funkce CodeNamespace objekty v Visual Basic nebo Visual C# protože pouze Visual C++ funkce definice funkce nejvyšší úrovně.

tz746te4.collapse_all(cs-cz,VS.110).gifDescription

Tento doplněk prochází různé prvky kódu Visual Studio souboru.Chcete-li spustit příklad, musí mít zdrojový kód, který soubor je otevřen v Visual Studio editor kódu.Další informace o spuštění příkladů, viz Jak: kompilace a spuštění příkladů kódu automatizace objektu modelu.

tz746te4.collapse_all(cs-cz,VS.110).gifKód

' 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

Můžete změnit hodnoty prvku modelu kódu

Po provedení určité typy úprav, může změnit přiřazené hodnoty prvky modelu kódu, jako je například třídy, struktury, funkce, atributy, Delegáti a tak dále.V důsledku toho nelze předpokládat, zůstane statické hodnoty.

Je-li například přiřadit kód prvku modelu do místní proměnné a poté nastavte hodnotu vlastnosti pro tuto místní proměnnou, místní proměnné nesmí obsahovat prvek modelu platný kód při později odkazu.Ve skutečnosti může obsahovat i prvek modelu jiný kód.

Zvažte třída obsahující funkci pojmenovanou "MyFunction", který je přiřazen CodeFunction proměnné a pak Name vlastnost CodeFunction je nastavena na hodnotu "YourFunction". Po tomto přiřazení proměnné je již zaručuje lokální proměnná představuje stejný CodeFunction.Následně přístup k hodnoty vlastnosti může vrátit E_FAIL výsledkem.

Doporučenou metodou pro řešení této situace je explicitně přiřadit místní proměnná modelu prvku správný kód před přístupem k jeho hodnoty vlastností.Následující příklad, jak to provést.(Kód je ve formě v.)

tz746te4.collapse_all(cs-cz,VS.110).gifDescription

Tento doplněk znázorňuje správný způsob přístupu hodnoty pro CodeElements tak, aby se načte správnou hodnotu.Další informace o spuštění příkladů, viz Jak: kompilace a spuštění příkladů kódu automatizace objektu modelu.

tz746te4.collapse_all(cs-cz,VS.110).gifKód

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);
    }
}

[!POZNÁMKA]

Nastavení vlastností dceřiné elementy elementu model vašeho kódu tento jev nevyskytuje.Pouze vlastnosti, které přímo ovlivňují CodeElement – jako je například název prvku, typ funkce, podpis metody, atd.– Tento jev deterministický.

Také tento příklad funguje pouze v případě nový název CodeElement je jedinečný mezi své členy na stejné úrovni.Důvodem je, že Item vlastnost vrací první shody, nefunguje přetížené metody nebo vlastnosti, částečné třídy nebo obory názvů se stejným názvem.

Viz také

Úkoly

Jak: kompilace příklad kódu pro rozšíření modelu Visual C++ kódu

Jak: Vytvoření doplňku

Názorný postup: Vytvoření Průvodce

Jak: kód manipulovat pomocí modelu kódu Visual C++ (Visual C#)

Koncepty

Zjištění kódu pomocí kódu modelu (Visual C#)

Model kódu Visual C++

Automatizační objekt modelu grafu

Model kódu Visual C++

Další zdroje

Vytváření a řízení prostředí Windows

Vytváření doplňků a průvodců

Automatizace a Reference rozšiřitelnosti