Zjišťování kódu pomocí modelu kódu (Visual Basic)
Doplňky Visual Studio jsou ve verzi aplikace Visual Studio 2013 zastaralé.Měli byste upgradovat doplňky na rozšíření VSPackage.Další informace o upgradu viz Nejčastější dotazy: Převádění doplňků na rozšíření VSPackage.
Model kódu Visual Studio nabízí klientům automatizace možnost vyhledat definice kódu v projektu a měnit tyto prvky kódu.Model kódu automaticky aktualizuje všechny odkazované objekty při provádění změn v editoru kódu.Například pokud odkazujete na objekt třídy a uživatel později přidá novou funkci, je uvedena mezi členy.Model kódu umožňuje klientům automatizace vyhnout se implementaci analyzátoru pro jazyky Visual Studio pro zjištění definic nejvyšší úrovně v projektu, jako jsou třídy, rozhraní, struktury, metody, vlastnosti a tak dále.
Základní kódový model Visual Studio se vyhýbá oblastem kód specifickým pro jazyk, takže, například, neposkytuje objektový model pro příkazy ve funkcích ani uvádí úplné informace o parametrech.Parametry modelu kódu poskytují pouze typ a název parametru a žádné informace, o tom, zda je parametr vstup, výstup, volitelný a podobně.Visual C++ nabízí rozšířenou verzi základního modelu jádra, která je zaměřena na projekty Visual C++.Informace najdete v tématu Model kódu Visual C++.
Přezkoumání a úprava kódu pomocí modelu kódu
Model kódu je především textový v tom ohledu, že program nebo kód v projektu jsou uloženy v textových souborech.Kód projektu naleznete, když použijete model projektu k návštěvě každé položky projektu a potom zkontrolujete, zda položka projektu obsahuje kód pomocí FileCodeModel.Pokud položka projektu obsahuje prvky kódu, tyto prvky mohou vrátit objekty z editoru a model kódu může použít model automatizace editoru textu ke změně kódu nebo provedení lokalizované analýzy.Pomocí editoru objektového modelu můžete vyžádat prvek kódu obsahující kurzor editoru nebo objekt TextPoint na úrovni třídy nebo funkce.
Primární vstupní bod do základního kódového modelu aplikace Visual Studio je objekt CodeModel.Obecná kolekce CodeElements se používá na několika místech v modelu kódu.Existuje jedna na úrovni CodeElements a na úrovni třídy nebo rozhraní, která vrací členy těchto objektů.Každý prvek kolekce CodeElements je objekt CodeElement2 a každý objekt CodeElement2 má vlastnost Kind, která identifikuje jeho typ, a to podle třídy, rozhraní, struktury, funkce, vlastnosti, proměnné a tak dále.
Modely kódu specifické pro jazyk
Visual C++ poskytuje rozšíření základního kódového modelu na cílový kód, který je specifický pro Visual C++.Například pokud Language označuje, že daný prvek kódu je objekt modelu kódu Visual C++, a Kind = vsCMElementClass, pak můžete vybrat QueryInterface (QI) pro CodeClass z modelu kódu Visual Studio nebo QI pro VCCodeClass z modelu kódu specifického pro jazyk Visual C++.Další informace o modelu konkrétního kódu Visual C++ naleznete v tématech Postupy: Manipulace s kódem pomocí modelu kódu Visual C++ (Visual Basic) a Model kódu Visual C++.
Poznámky ke kódovému modelu Visual Studio Core
Pouze implementace kódového modelu Visual C++ provádí modelování specifické pro jazyk jazykových implementací Microsoft.
Některé jazykové implementace neimplementují celý kódový model Visual Studio.Témata nápovědy upozorňují na výjimky, pokud existují.Většina rozdílů mezi implementacemi modelu kódu je způsobena funkčními rozdíly mezi jazyky.Nelze například přidat funkce do objektů CodeNamespace v Visual Basic nebo Visual C#, protože pouze Visual C++ obsahuje definice funkcí na nejvyšší úrovni.
Description
Tento doplněk prochází různé prvky kódu souboru Visual Studio.Chcete-li spustit příklad, musíte mít otevřený soubor zdrojového kódu v editoru kódu Visual Studio.Další informace o spuštění těchto příkladů naleznete v tématu Postupy: Kompilace a spuštění příkladů kódu objektu automatizace.
Kó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
Hodnoty prvků modelu kódu lze změnit
Přiřazené hodnoty prvků kódového modelu jako třídy, struktury, funkce, atributy, delegáty a tak dále se mohou po provedení určitých typů úprav změnit.V důsledku toho nelze předpokládat, že hodnoty zůstanou statické.
Pokud například přiřadíte prvek modelu kódu lokální proměnné, a pak nastavíte hodnotu vlastnosti pro tuto místní proměnnou, místní proměnná nesmí obsahovat prvek modelu platného kódu, když na ni později odkazujete.Ve skutečnosti může dokonce obsahovat jiný prvek modelu kódu.
Zvažte třídu obsahující funkci s názvem "MáFunkce", která je přiřazena k proměnné CodeFunction a pak vlastnost Name funkce CodeFunction je nastavena na hodnotu "YourFunction". Po přiřazení této proměnné již není zaručeno, že místní proměnná představuje stejné CodeFunction.Následný přístup k hodnotě vlastnosti může vrátit E_FAIL jako výsledek.
Doporučený postup pro řešení této situace je explicitně přiřadit místní proměnnou ke správnému prvku kódového modelu před přístupem k jeho hodnotám vlastností.Následuje příklad, jak to provést. (Kód je ve formě doplňku).
Description
Tento doplněk ukazuje správný způsob, jak získat přístup k hodnotám pro CodeElements tak, aby se načetla správná hodnota.Další informace o spuštění těchto příkladů naleznete v tématu Postupy: Kompilace a spuštění příkladů kódu objektu automatizace.
Kó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]
Nastavování vlastností podřízených prvků prvku modelu kódu toto chování neprojevuje.Pouze vlastnosti, které mají bezprostřední vliv na CodeElement – například název prvku, typ funkce, podpis metody, atd. – projevují toto nedeterministické chování.
Tento příklad funguje pouze tehdy, pokud nový název CodeElement je jedinečný mezi prvky na stejné úrovni.Důvodem je, že vlastnost Item vrací první shodu, což nefunguje pro přetížené metody/vlastnosti, částečné třídy ani obory názvů se stejným názvem.
Viz také
Úkoly
Postupy: Kompilace ukázkového kódu pro rozšíření modelu kódu Visual C++
Postupy: Manipulace s kódem pomocí modelu kódu Visual C++ (Visual C#)
Koncepty
Zjišťování kódu pomocí modelu kódu (Visual C#)
Graf modelu objektů automatizace