Descobrindo o código usando o modelo de código (Visual Basic)

O Visual Studio modelo de código oferece a clientes de automação a capacidade de descobrir as definições de código em um projeto e modificar esses elementos de código.O modelo de código atualiza automaticamente todos os objetos mencionados quando modificações são feitas no editor de código.Por exemplo, se você fazer referência a um objeto de classe e posterior, um usuário adiciona uma nova função, ele é listado entre os membros.O modelo de código permite que os clientes de automação evitar a implementação de um analisador para Visual Studio idiomas para descobrir as definições de alto nível em um projeto, como, por exemplo, classes, interfaces, estruturas, métodos, propriedades e assim por diante.

O Visual Studio modelo de código de central evita a áreas específicas do idioma de código, para que isso não acontecer, por exemplo, fornecer um modelo de objeto para as instruções em funções ou fornecem detalhes completos sobre parâmetros.Para os parâmetros, o modelo de código expõe apenas o tipo e o nome do parâmetro e nenhuma informação é fornecida sobre se o parâmetro é entrado, saída, opcional e assim por diante.Visual C++oferece uma versão estendida do que o modelo de código do núcleo é dirigido ao Visual C++ projetos.Para obter informações sobre isso, consulte Modelo de código C++ Visual.

Examinando e edição de código com o modelo de código

O modelo de código é principalmente baseado em texto que o programa ou o código do projeto é armazenado em arquivos de texto.Você pode encontrar o código de um projeto usando o modelo de projeto para visitar cada item de projeto e, em seguida, verificar se o item de projeto contém código usando FileCodeModel.Se um item de projeto contém elementos de código, esses elementos podem retornar os objetos do editor e o modelo de código pode usar o modelo de automação do editor de texto para modificar o código ou executa análise localizadas.Usando o modelo de objeto do Editor, você pode solicitar o elemento de código que contém o ponto de inserção do editor ou um TextPoint o objeto no nível de função ou classe.

O ponto de entrada principal para o Visual Studio o modelo de código do núcleo é o CodeModel objeto.Geral CodeElements coleção é usada em vários lugares no modelo de código.Há um de cada a CodeElements nível e no nível de classe ou interface que retorna os membros desses objetos.Cada elemento de um CodeElements coleção é um CodeElement2 objeto e cada CodeElement2 objeto tem um Kind propriedade que identifica seu tipo, seja ela uma classe, interface, struct, função, propriedade, variável e assim por diante.

Modelos de código de idioma específico

Visual C++Fornece uma extensão para o modelo de código principal para o destino Visual C++-código específico.Por exemplo, se Languageindica que um elemento de código fornecido é um Visual C++ o objeto de modelo de código, e Kind = vsCMElementClass, e em seguida, você pode escolher para ambos QueryInterface (QI) para CodeClass do Visual Studio modelo de código ou QI de VCCodeClass da Visual C++ modelo de código de idioma específico.Para obter mais informações sobre o Visual C++-modelo de código específico, consulte Como: manipular o código usando o modelo de código C++ Visual (Visual Basic) e Modelo de código C++ Visual.

tz746te4.collapse_all(pt-br,VS.110).gifNotas para o modelo de código de núcleo Visual Studio

  • Somente o Visual C++ implementação do modelo de código realiza modelagem específicos do idioma das implementações de idioma do Microsoft.

  • Implementações de alguns idiomas não implementam todo o Visual Studio modelo de código.Tópicos da Ajuda destaque exceções quando existirem.A maioria das diferenças entre implementações do modelo de código são devido a diferenças funcionais entre os idiomas.Por exemplo, você não é possível adicionar funções para CodeNamespace objetos em Visual Basic ou Visual C# porque somente Visual C++ apresenta definições de função de nível superior.

tz746te4.collapse_all(pt-br,VS.110).gifDescrição

Este suplemento percorre os vários elementos de código de um Visual Studio arquivo.Para executar o exemplo, você deve ter um código fonte do arquivo aberto no Visual Studio o editor de código.Para obter mais informações sobre como executar os exemplos, consulte Como: compilar e executar os exemplos de código de modelo de objeto de automação.

tz746te4.collapse_all(pt-br,VS.110).gifCódigo

' 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

Valores de elemento de modelo de código podem alterar.

Os valores atribuídos de elementos de modelo de código, como, por exemplo, classes, estruturas, funções, atributos, delegados e assim por diante, podem ser alterados após fazer determinados tipos de edições.Conseqüentemente, você não pode presumir que os valores permanecerá estáticos.

Se você atribuir um elemento de modelo de código a uma variável local, por exemplo, e, em seguida, definir um valor de propriedade para essa variável local, a variável local não pode conter um elemento de modelo de código válido, ao fazer referência mais tarde.Na verdade, ele ainda pode conter um elemento de modelo de código diferente.

Considere uma classe que contém uma função chamada "MyFunction", que é atribuído a uma CodeFunction variável e, em seguida o Name propriedade da CodeFunction é definida como o valor "YourFunction". Após a atribuição de variável, você é garantidas não mais que a variável local representa o mesmo CodeFunction.Subseqüentemente, acessando o valor da propriedade pode retornar E_FAIL como resultado.

A abordagem recomendada para lidar com essa situação é explicitamente reatribuir a variável local para o elemento de modelo de código correto antes de acessar os seus valores de propriedade.A seguir mostra um exemplo de como fazer isso.(O código está na forma de um add-in).

tz746te4.collapse_all(pt-br,VS.110).gifDescrição

Este suplemento demonstra a maneira correta de valores de acesso para CodeElements para que o valor correto é recuperado.Para obter mais informações sobre como executar os exemplos, consulte Como: compilar e executar os exemplos de código de modelo de objeto de automação.

tz746te4.collapse_all(pt-br,VS.110).gifCódigo

[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);
    }
}
ObservaçãoObservação

Definindo as propriedades de elementos filho do elemento de modelo seu código não apresentam esse comportamento.Somente as propriedades que afetam diretamente o CodeElement — como, por exemplo, o nome do elemento, o tipo de uma função, a assinatura de um método, etc.— apresentam esse comportamento não-determinístico.

Além disso, este exemplo funciona somente se o novo nome da CodeElement é única entre seus irmãos.Isso ocorre porque o Item propriedade retorna a primeira correspondência, o que não funciona para espaços para nome com o mesmo nome, classes parciais ou métodos sobrecarregadas/propriedades.

Consulte também

Tarefas

Como: compilar o código de exemplo para extensibilidade do Visual C++ código modelo

Como: criar um suplemento

Passo a passo: Criando um assistente

Como: manipular o código usando o modelo de código do Visual C++ (Visual C#)

Conceitos

Descobrindo o código usando o modelo de código (Visual C#)

Modelo de código C++ Visual

Gráfico de modelo de objeto de automação

Modelo de código C++ Visual

Outros recursos

Criar e controlar o ambiente Windows

A criação de suplementos e assistentes

Automação e extensibilidade referência