Wie überprüfen Sie, ob eine Variable programmatisch in einem Projekt verwendet wird?
Frage
In VB.NET (oder C #), wie ich programmatisch bestimmen kann, ob eine öffentliche Variable in der Klasse helper.vb innerhalb eines Projektes überall verwendet wird?
Lösung
Das Find-Objekt können Sie nach Text suchen und in Orten der Umgebung zu ersetzen, die solche Operationen, wie der Quelltext-Editor unterstützen.
Es ist in erster Linie für den Makroaufnahmezweck. Der Makro-Aufnahme-Mechanismus Editor verwendet anstatt TextSelection.FindPattern finden, so dass Sie die globale Suche Funktionalität entdecken können, und weil es in der Regel sinnvoller als mit dem Objekt für Textselection-Operationen wie Find-in-Dateien.
Wenn der Suchvorgang ist asynchron, wie Alle suchen, dann ist die FindDone Das Ereignis tritt auf, wenn der Vorgang abgeschlossen ist.
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
Andere Tipps
Alle Referenzen ist dein Freund.
Sie müssen Reflexion verwenden und es wäre kompliziert sein.
Warum tun Sie diese programmaticly? Sie wissen, dass Visual Studio eine „alle Verweise finden“ Funktion, die dies für Sie tun können.
Reflector hat die Funktion analysieren. Oder ist dies eine Art Laufzeit Funktionalität sind Sie nach?
Sprechen Sie über das tun dies, bevor der Code kompiliert wird? Dadurch gegen eine kompilierte Assembly wäre wahrscheinlich nicht trivial, wenn auch Tools wie Mono.Cecil helfen könnte . Sie müssten eigentlich jede Methode gehen und die IL Anweisungen für Anrufe an die in Frage kommen und setzen Methoden der Immobilie zu inspizieren. Es könnte in der Tat nicht so schlimm sein, obwohl, besonders wenn man Cecil statt System.Reflection verwendet. Cecil ist auch viel schneller, als es Baugruppen wie Dateien behandelt, anstatt sie tatsächlich in der Anwendungsdomäne geladen werden.
Wenn Sie wollen dies auf dem tatsächlichen Quellcode eines Projekts Dinge auszuführen, sind ganz anders. Ich weiß nicht viel über Visual Studio-Add-Ins, aber Sie könnten die „Suche alle Verweise“ Befehl programmatisch aufgerufen werden können, und die Ergebnisse nutzen.
Es könnte auch etwas in System.CodeDom sein, die helfen könnten. Es sieht aus wie Sie eine CodeParser
verwenden könnte den Code in ein CodeCompileUnit
zu analysieren, und dann von dort aus alle Aussagen in allen Verfahren zu gehen und überprüfen zu verwandten CodePropertyReferenceExpression
s.