Odkrywanie kod przy użyciu modelu kodu (Visual Basic)
Visual Studio Kod modelu oferuje klientom automatyzacji możliwość Odkryj definicje kodu w projekcie i zmodyfikować te elementy kodu.Model kod automatycznie aktualizuje wszystkie obiekty po dokonaniu modyfikacji w edytorze kodu.Na przykład jeśli użytkownik później dodaje nową funkcję odwołać obiektu klasy, jest wymienione wśród członków.Model kodu pozwala uniknąć wykonywania parser dla klientów automatyzacji Visual Studio języków w celu odnalezienia wysokiego szczebla definicje w projekcie, takich jak klasy, interfejsy, struktury, metody, właściwości i itd.
Visual Studio Modelu kodu core unika obszarów specyficzne dla języka kodu, tak nie jest, na przykład, przewidują model obiektowy instrukcji w funkcji lub podać pełne informacje dotyczące parametrów.Dla parametrów model kod opisuje typ i nazwę parametru, a żadne informacje nie jest pod warunkiem, że o czy parametr jest wejście, wyjście, opcjonalne i itp..Visual C++oferuje rozszerzoną wersją modelu kodu core, który jest skierowane do Visual C++ projektów.Aby uzyskać informacje na ten temat, zobacz Visual C++ kod modelu.
Badanie i Edycja kodu z modelu kodu
Model kodu jest przede wszystkim oparte na tekst, ponieważ program lub kodu w projekcie są przechowywane w plikach tekstowych.Znajdź kod projektu przy użyciu modelu projektu do odwiedzania każdego elementu projektu, a następnie sprawdź, czy element projektu zawiera kod przy użyciu FileCodeModel.Jeśli element projektu zawiera elementy kodu, elementy te można zwrócić obiektów z edytora i modelu kodu można użyć modelu automatyzacji Edytor tekstu do modyfikowania kodu lub wykonywać analizy zlokalizowane.Za pomocą edytora modelu obiektów, można zażądać element kod znajduje się punkt wstawiania z edytora lub TextPoint obiektu na poziomie funkcji lub klasy.
Podstawowym punktem wejścia do Visual Studio jest podstawowy model kodu CodeModel obiektu.Ogólne CodeElements kolekcji jest używana w kilku miejscach w modelu kodu.Istnieje jeden na CodeElements poziomu i na poziomie klasy lub interfejsu, który zwraca członków tych obiektów.Każdy element CodeElements kolekcji jest CodeElement2 obiektu i każdego CodeElement2 obiekt ma Kind właściwość, która identyfikuje jej typ, czy jest klasa, interfejs, struct, funkcji, właściwości, zmienna i tak dalej.
Modele kod specyficzne dla języka
Visual C++zawiera rozszerzenie modelu kodu core do obiektu docelowego Visual C++-określonym kodem.Na przykład jeśli Languagewskazuje, że element danego kodu jest Visual C++ kod modelu obiektów, i Kind = vsCMElementClass, a następnie wybierz polecenie do jednej metody QueryInterface (QI) dla CodeClass z Visual Studio kod modelu lub QI na VCCodeClass z Visual C++ modelu kod specyficzny dla języka.Aby uzyskać więcej informacji na Visual C++-model szczególnego kodu, zobacz Jak: manipulować kod przy użyciu Visual C++ kod modelu (Visual Basic) i Visual C++ kod modelu.
Informacje o modelu kodu Core Visual Studio
Tylko Visual C++ implementację modelu kodu wykonuje specyficzne dla języka modelowania implementacji języka Microsoft.
Niektóre języki implementacji należy implementować cały Visual Studio kod modelu.Tematy pomocy punkt poza wyjątkami, gdy takie istnieją.Większość różnice między implementacjami modelu kodu są ze względu na różnice funkcjonalne między językami.Na przykład, nie można dodać funkcje CodeNamespace obiektów w Visual Basic lub Visual C# ponieważ tylko Visual C++ funkcje definicje funkcji najwyższego poziomu.
Opis
Ten dodatek instruktaże różnych elementów kodu Visual Studio pliku.Aby uruchomić przykład, musi mieć kod źródłowy, plik otwarty w Visual Studio Edytor kodu.Aby uzyskać więcej informacji na temat uruchamiania przykłady, zobacz Jak: skompilować i uruchomić przykłady kodu modelu obiektu automatyzacji.
Kod
' 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
Można zmieniać wartości elementów modelu kodu
Po dokonaniu pewnych rodzajów edycje, może zmienić przypisane wartości elementów modelu kodu, takich jak klasy, strukturach, funkcje, atrybuty, delegatów i tak dalej.W konsekwencji nie można zakładać, wartości pozostanie statyczne.
Jeśli można przypisać elementu modelu kodu do zmiennej lokalnej, na przykład, a następnie ustaw wartość właściwości dla tej zmiennej lokalnej, zmienna lokalna nie może zawierać elementu modelu prawidłowy kod, gdy później odwoływać.W rzeczywistości mogą nawet zawierać element modelu inny kod.
Należy wziąć pod uwagę klasa zawierająca funkcję o nazwie "MyFunction", który jest przypisany do CodeFunction zmiennej, a następnie Name właściwość CodeFunction jest ustawiona na wartość "YourFunction". Po tym przypisanie zmiennej, masz już gwarancję lokalnych zmienna reprezentuje taki sam CodeFunction.Następnie dostęp do wartości właściwości mogą zwracać E_FAIL w wyniku.
Zalecane podejście do zajmowania się tej sytuacji jest jawnie przypisać zmiennej lokalnej sieci elementu modelu poprawny kod przed uzyskaniem dostępu do wartości jego właściwości.Poniżej przedstawiono przykład sposobu wykonania tego zadania.(Kod jest w formie dodatku).
Opis
Ten dodatek demonstruje poprawny sposób wartości dostęp dla CodeElements tak, aby poprawną wartość jest pobierana.Aby uzyskać więcej informacji na temat uruchamiania przykłady, zobacz Jak: skompilować i uruchomić przykłady kodu modelu obiektu automatyzacji.
Kod
[Programu 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);
}
}
[!UWAGA]
Ustawianie właściwości elementów podrzędnych elementu modelu kodu nie stosują to zachowanie.Tylko te właściwości, które bezpośrednio wpływają na CodeElement — takie jak nazwa elementu, typ funkcji, podpis metody, itd.— stosują to zachowanie deterministyczny.
Ponadto, w tym przykładzie działa tylko wtedy, gdy nowa nazwa CodeElement jest unikatowy wśród jego rodzeństwa.Wynika to z Item właściwość zwraca pierwszy mecz nie działa dla przeciążonej metody/właściwości, klasy częściowe lub obszarów nazw o tej samej nazwie.
Zobacz też
Zadania
Jak: skompilować kod przykładowy dla Visual C++ kod modelu rozszerzalności
Instruktaż: Tworzenie kreatora
Jak: manipulować kod przy użyciu modelu kodu Visual C++ (Visual C#)
Koncepcje
Odkrywanie kod przy użyciu modelu kodu (Visual C#)
Wykres modelu obiektu automatyzacji
Inne zasoby
Tworzenia i kontrolowania środowisku systemu Windows.