Pergunta

Em VB.NET (ou C #) como posso programaticamente determinar se uma variável pública em helper.vb classe é usado em qualquer lugar dentro de um projeto?

Foi útil?

Solução

A partir MSDN

O objeto Find permite-lhe procurar e substituir o texto em locais de meio ambiente que suportar tais operações, como o editor de código.

Destina-se principalmente para fins de gravação de macros. macro mecanismo de gravação usos do editor Encontrar em vez de TextSelection.FindPattern para que você possa descobrir a funcionalidade de localização global, e porque geralmente é mais útil do que usar o objeto TextSelection para tais operações como Find-in-arquivos.

Se a operação de busca é assíncrona, como Localizar todos, em seguida, o FindDone ocorre evento quando o conclui operação.

Sub ActionExample()
   Dim objFind As Find = objTextDoc.DTE.Find

   ' Set the find options.
   objFind.Action = vsFindAction.vsFindActionFindAll
   objFind.Backwards = False
   objFind.FilesOfType = "*.vb"
   objFind.FindWhat = "<Variable>"
   objFind.KeepModifiedDocumentsOpen = False
   objFind.MatchCase = True
   objFind.MatchInHiddenText = True
   objFind.MatchWholeWord = True
   objFind.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
   objFind.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
   objFind.SearchPath = "c:\<Your>\<Project>\<Path>"
   objFind.SearchSubfolders = False
   objFind.Target = vsFindTarget.vsFindTargetCurrentDocument
   ' Perform the Find operation.
   objFind.Execute()
End Sub



<System.ContextStaticAttribute()> _
Public WithEvents FindEvents As EnvDTE.FindEvents

Public Sub FindEvents_FindDone(ByVal Result As EnvDTE.vsFindResult, _
                               ByVal Cancelled As Boolean) _
                               Handles FindEvents.FindDone
   Select Case Result 
        case vsFindResultFound
             'Found!
        case else
             'Not Found
   Ens select
End Sub

Outras dicas

Encontre todas as referências é seu amigo.

Você precisaria usar a reflexão e seria complicado.

Por que você está fazendo isso programmaticly? Você sabe que Visual Studio tem uma característica "Localizar todas as referências" que pode fazer isso por você.

refletor tem a característica Analisar. Ou, isso é algum tipo de funcionalidade tempo de execução que são depois?

Você está falando sobre como fazer isso antes que o código é compilado? Fazer isso contra um compilado assembly provavelmente não seria trivial, mas ferramentas como Mono.Cecil poderia ajudar . Você teria que realmente andar cada método e inspecionar as instruções IL para chamadas para os métodos get e set da propriedade em questão. Pode não ser realmente tão ruim, porém, especialmente se você usou Cecil vez de System.Reflection. Cecil também é muito mais rápido, como ele trata os conjuntos de arquivos em vez de realmente colocá-los no domínio de aplicativo.

Se você está querendo executar este sobre o código fonte real de um projeto de coisas são muito diferentes. Eu não sei muito sobre Visual Studio Add-Ins, mas você pode ser capaz de invocar o comando "Localizar todas as referências" programaticamente e usar os resultados.

Há também pode ser algo em System.CodeDom que poderia ajudar. Parece que você poderia usar um CodeParser para analisar o código em um CodeCompileUnit, e de lá a pé todas as declarações em todos os métodos e verificar se há CodePropertyReferenceExpressions relacionados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top