¿Cómo verifica si una variable se utiliza en un proyecto mediante programación?
Pregunta
En VB.NET (o C #), ¿cómo puedo determinar mediante programación si una variable pública en la clase helper.vb se usa en cualquier lugar dentro de un proyecto?
Solución
De MSDN
El objeto Buscar le permite buscar y reemplazar texto en lugares del entorno que admiten tales operaciones, como el editor de código.
Está destinado principalmente para propósitos de grabación de macros. El mecanismo de grabación de macros del editor utiliza Find en lugar de TextSelection.FindPattern para que pueda descubrir la funcionalidad de búsqueda global, y porque generalmente es más útil que usar el objeto TextSelection para operaciones como Find-in-files.
Si la operación de búsqueda es asíncrona, como Buscar todos, entonces el evento FindDone se produce cuando se completa la operación.
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
Otros consejos
Buscar todas las referencias es tu amigo.
Necesitarías usar la reflexión y sería complicado.
¿Por qué haces esto programáticamente? Sabe que Visual Studio tiene un " Buscar todas las referencias " característica que puede hacer esto por usted.
Reflector tiene la función Analizar. O, ¿es este un tipo de funcionalidad de tiempo de ejecución que buscas?
¿Está hablando de hacer esto antes de compilar el código? Hacer esto contra un ensamblaje compilado probablemente no sería trivial, aunque herramientas como Mono.Cecil podrían ayudar . Tendría que recorrer cada método e inspeccionar las instrucciones de IL para las llamadas a los métodos de obtención y configuración de la propiedad en cuestión. Puede que en realidad no sea tan malo, especialmente si usaste Cecil en lugar de System.Reflection. Cecil también es mucho más rápido, ya que trata los ensamblajes como archivos en lugar de cargarlos en el dominio de la aplicación.
Si desea ejecutar esto en el código fuente real de un proyecto, las cosas son muy diferentes. No sé mucho acerca de los complementos de Visual Studio, pero es posible que pueda invocar " Buscar todas las referencias " ordena programáticamente y usa los resultados.
También podría haber algo en System.CodeDom que podría ayudar. Parece que podría usar un CodeParser
para analizar el código en un CodeCompileUnit
, y luego desde allí, caminar todas las declaraciones en todos los métodos y verificar los CodePropertyReferenceExpression
s.