c# - ¿Cómo se comprueba si una variable se usa programáticamente en un proyecto?
.net vb.net (5)
Encuentra todas las referencias es tu amigo.
En VB.NET (o C #) ¿cómo puedo determinar programáticamente si una variable pública en la clase helper.vb se usa en cualquier lugar dentro de un proyecto?
Necesitarías usar el reflejo y sería complicado.
¿Por qué estás haciendo esto programáticamente? Usted sabe que Visual Studio tiene una función "Buscar todas las referencias" que puede hacer esto por usted.
Reflector tiene la función Analizar. ¿O es esto algún tipo de funcionalidad de tiempo de ejecución que buscas?
¿Estás hablando de hacer esto antes de compilar el código? Hacer esto contra un ensamblado compilado probablemente no sería trivial, aunque herramientas como Mono.Cecil podrían ayudar. En realidad, tendría que caminar cada método e inspeccionar las instrucciones de IL para las llamadas a los métodos de obtención y establecimiento de la propiedad en cuestión. Sin embargo, 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 quieres ejecutar esto en el código fuente real de un proyecto, las cosas son muy diferentes. No sé mucho sobre complementos de Visual Studio, pero es posible que pueda invocar el comando "Buscar todas las referencias" mediante programación y usar 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 una CodeCompileUnit
y, a partir de ahí, recorrer todas las instrucciones en todos los métodos y comprobar si hay CodePropertyReferenceExpression
s relacionadas.
Desde MSDN
El objeto Find le permite buscar y reemplazar texto en lugares del entorno que admiten tales operaciones, como el editor de código.
Está destinado principalmente para fines de macro grabación. El mecanismo de macrocomprobación del editor usa Find en lugar de TextSelection.FindPattern para que pueda descubrir la funcionalidad de búsqueda global y porque, por lo general, es más útil que usar el objeto TextSelection para operaciones tales como Find-in-files.
Si la operación de búsqueda es asincrónica, como Buscar todo, entonces el Evento FindDone se produce cuando la operación finaliza.
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