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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top