2008-09-25 11 views

Antwort

2

Von MSDN

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 Makro-Aufnahmezwecke gedacht. Der Makroaufzeichnungsmechanismus des Editors verwendet Suchen statt TextSelection.FindPattern, so dass Sie die globale Suchfunktionalität ermitteln können, und weil es im Allgemeinen nützlicher ist, als das TextSelection-Objekt für solche Vorgänge wie Suchen in Dateien zu verwenden.

Wenn die Suchoperation asynchron ist, z. B. Alle suchen, tritt das Ereignis FindDone 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 
0

Sie müssten Reflexion verwenden und es wäre kompliziert.

Warum machst du das programmatisch? Sie wissen, dass Visual Studio über die Funktion "Alle Referenzen suchen" verfügt, mit der dies für Sie erledigt werden kann.

3

Finden Sie alle Referenzen ist Ihr Freund.

0

Reflektor verfügt über die Funktion Analysieren. Oder ist das eine Art Laufzeitfunktion, nach der Sie suchen?

0

Sprechen Sie darüber, bevor der Code kompiliert wird? Dies gegen eine kompilierte Assembly zu tun, wäre wahrscheinlich nicht trivial, obwohl Tools wie Mono.Cecil helfen könnten. Sie müssten tatsächlich jede Methode durchlaufen und die IL-Anweisungen für Aufrufe der Methoden get und set der betreffenden Eigenschaft prüfen. Es ist jedoch möglicherweise nicht so schlimm, besonders wenn Sie Cecil anstelle von System.Reflection verwenden. Cecil ist auch viel schneller, da es Assemblies als Dateien behandelt, anstatt sie tatsächlich in die Anwendungsdomäne zu laden.

Wenn Sie dies auf den tatsächlichen Quellcode eines Projekts ausführen möchten, sind die Dinge sehr unterschiedlich. Ich weiß nicht viel über Visual Studio-Add-Ins, aber möglicherweise können Sie den Befehl "Alle Referenzen suchen" programmgesteuert aufrufen und die Ergebnisse verwenden.

Es könnte auch etwas in System.CodeDom helfen. Es sieht so aus, als könnten Sie eine CodeParser verwenden, um den Code in eine CodeCompileUnit zu analysieren, und von dort aus gehen Sie alle Anweisungen in allen Methoden und überprüfen Sie für verwandte CodePropertyReferenceExpression s.