Descobrindo o código usando o modelo de código (Visual translation from VPE for Csharp)
The Visual Studio modelo de código oferece automação clientes 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 todos os objetos referenciados automaticamente quando modificações são feitas no editor de código.Por exemplo, se referir a um objeto de classe e um usuário posteriormente adiciona uma nova função, seja listado entre os membros.O modelo de código permite que clientes de automação evitar a implementação de um analisador de Visual Studio idiomas para descobrir sistema autônomo definições de alto nível em um projeto such sistema autônomo classes, interfaces, estruturas, métodos, propriedades e so on.
The Visual Studio modelo de código principal evita específico a um linguagem áreas de código, para que ele não, por exemplo, fornecem um modelo de objeto para as instruções em funções ou fornecem detalhes completos sobre parâmetros. Para 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 modelo de código principal destinado para Visual C++ projetos. Para obter informações sobre isso, consulte O Visual C++ Code Model.
Examinar e editar código com o modelo de código
O modelo de código é principalmente baseado em texto o programa ou código do projeto é armazenado em arquivos de texto.Você pode encontrar código do projeto usando o modelo de projeto para visitar cada item de projeto e, em seguida, verifique 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 objetos do editor de e o modelo de código pode usar o modelo de automação do editor de texto para modificar o código ou executar localizado de análise.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 objeto no nível de função ou classe.
O ponto de entrada principal para o Visual Studio modelo de código principal é o CodeModel objeto. Um Geral CodeElements coleção é usada em vários lugares no modelo de código. Há um de cada o 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 o 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 específicos de idiomas
Visual C++ Fornece uma extensão ao modelo de código principal para o destino Visual C++-código específico. For example, if Language indicates that a given code element is a Visual C++ code model object, and Kind = vsCMElementClass, then you can choose to either QueryInterface (QI) for CodeClass from the Visual Studio code model or QI for VCCodeClass from the Visual C++ language-specific code model.Para obter mais informações sobre o Visual C++-modelo de código específicas, consulte Como: Manipular o código usando o modelo do Visual C++ Code (Visual translation from VPE for Csharp) e O Visual C++ Code Model.
Notas para o Visual Studio Code Model
Somente o Visual C++ implementação do modelo de código realiza modelagem específico a um idioma das implementações de linguagem Microsoft.
Alguns idiomas não implementam o inteiro Visual Studio modelo de código. Os 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 às diferenças funcionais entre os idiomas.Por exemplo, você não pode 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.
Descrição
Este suplemento percorre os elementos de código de um Visual Studio arquivo. Para executar o exemplo, você deve ter um arquivo de código em aberto no Visual Studio editor de código. Para obter mais informações sobre como executar os exemplos, consulte Como: Compilar e executar os exemplos de códigos automação objeto modelo.
Código
// 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 );
}
}
}
Podem alterar valores de elemento de modelo de código
sistema autônomo valores atribuídos de elementos de modelo de código, sistema autônomo classes, structs, funções, atributos, delegados e assim por diante, podem ser alterados depois de fazer determinados tipos de edições.Conseqüentemente, você não pode presumir que os valores permanecerá estático.
Se você atribuir um elemento de modelo de código a uma variável local, por exemplo, e, em seguida, conjunto um valor da propriedade para essa variável local, a variável local não pode conter um elemento de modelo de código válido quando você faz 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 umCodeFunction variável e, em seguida, o Name propriedade das CodeFunctioné definido como o valor "YourFunction." Após a atribuição de variável, não mais é garantidas sua variável local representa o mesmo CodeFunction. Posteriormente, acessando o valor da propriedade pode retornar E_FAIL sistema autônomo 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 seus valores de propriedade.A seguir mostra um exemplo de como fazer isso.(É o código na forma de um suplemento.)
Descriçã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ódigos automação objeto modelo.
Có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ção: |
---|
Definindo as propriedades de elementos filho do elemento de modelo de seu código não apresenta esse comportamento.Somente propriedades que afetam diretamente o CodeElement — sistema autônomo o nome do elemento, o tipo de uma função, a assinatura de método, etc.. — apresentam esse comportamento não-determinístico. Além disso, este exemplo funciona somente se o novo nome dos CodeElement é única entre seus irmãos.Isso ocorre porque o Item propriedade retorna a primeira correspondência não funciona para propriedades/métodos sobrecarregadas, classes parcial ou espaços para nomes com o mesmo nome. |
Consulte também
Tarefas
Como: Compilar o código de exemplo para extensibilidade do Visual C++ Code Model
Demonstra Passo a passo: Criando um assistente
Como: Manipular o código usando o modelo do Visual C++ Code (Visual translation from VPE for Csharp)
Como: Manipular o código usando o modelo de código C++ Visual (Visual Basic)
Conceitos
Descobrindo o código usando o modelo de código (Visual Basic)
Gráfico do modelo de objetos de automação
Outros recursos
Criando e controlando o ambiente Windows