Sdílet prostřednictvím


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

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 kódu Visual C++ (Visual C#) a Model kódu Visual C++.

ms228763.collapse_all(cs-cz,VS.110).gifPoznámky k modelu kódu Visual Studio

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

  • Některé jazyky 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ě.

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

Tento doplněk prochází prvky kódu Visual Studio souboru.Chcete-li spustit příklad, musí mít kód soubor 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.

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

// Add-in code.
using System.Windows.Forms;
public void OnConnection(object application,
 Extensibility.ext_ConnectMode connectMode, object addInInst, ref
 System.Array custom)
{
    _applicationObject = (_DTE2)application;
    _addInInstance = (AddIn)addInInst;
    // Pass the applicationObject member variable to the code example.
    OutlineCode((DTE2)_applicationObject); 
}

public void OutlineCode( DTE2 dte ) 
{ 
    FileCodeModel fileCM = 
      dte.ActiveDocument.ProjectItem.FileCodeModel; 
    CodeElements elts = null; 
    elts = fileCM.CodeElements; 
    CodeElement elt = null; 
    int i = 0; 
    MessageBox.Show( "about to walk top-level code elements ..."); 
    for ( i=1; i<=fileCM.CodeElements.Count; i++ ) 
    { 
        elt = elts.Item( i ); 
        CollapseElt( elt, elts, i ); 
    } 
} 

public void CollapseElt( CodeElement elt, CodeElements elts, long loc ) 
{ 
    EditPoint epStart = null; 
    EditPoint epEnd = null; 
    epStart = elt.StartPoint.CreateEditPoint(); 
    // Do this because we move it later.
    epEnd = elt.EndPoint.CreateEditPoint(); 
    epStart.EndOfLine(); 
    if ( ( ( elt.IsCodeType ) & ( elt.Kind !=
      vsCMElement.vsCMElementDelegate ) ) ) 
    { 
        MessageBox.Show( "got type but not a delegate, 
          named : " + elt.Name); 
        CodeType ct = null; 
        ct = ( ( EnvDTE.CodeType )( elt ) ); 
        CodeElements mems = null; 
        mems = ct.Members; 
        int i = 0; 
        for ( i=1; i<=ct.Members.Count; i++ ) 
        { 
            CollapseElt( mems.Item( i ), mems, i ); 
        } 
    } 
    else if ( ( elt.Kind == vsCMElement.vsCMElementNamespace ) ) 
    { 
        MessageBox.Show( "got a namespace, named: " + elt.Name); 
        CodeNamespace cns = null; 
        cns = ( ( EnvDTE.CodeNamespace )( elt ) ); 
        MessageBox.Show( "set cns = elt, named: " + cns.Name); 

        CodeElements mems_vb = null; 
        mems_vb = cns.Members; 
        MessageBox.Show( "got cns.members"); 
        int i = 0; 

        for ( i=1; i<=cns.Members.Count; i++ ) 
        { 
            CollapseElt( mems_vb.Item( i ), mems_vb, i ); 
        } 
    } 
}

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

ms228763.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.

ms228763.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#)

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

Koncepty

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

Model kódu Visual C++

Automatizační objekt modelu grafu

Další zdroje

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

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

Automatizace a Reference rozšiřitelnosti