2008-09-25 57 views

回答

2

MSDN

Find對象允許您搜索並支持這樣的操作,如代碼編輯器環境的地方替換文本。

它主要用於宏記錄目的。編輯器的宏記錄機制使用Find而不是TextSelection.FindPattern,以便您可以發現全局查找功能,並且因爲它通常比使用TextSelection對象執行Find-in-files等操作更有用。

如果搜索操作是異步的,比如所有的查找,然後在操作完成時發生FindDone事件。

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

你需要使用反射,這將是複雜的。

你爲什麼要這樣編程?你知道Visual Studio有一個「查找所有引用」功能,可以爲你做到這一點。

3

找到所有的引用是你的朋友。

0

反射器具有分析功能。或者,這是你之後的某種運行時功能嗎?

0

你說的是在編譯代碼之前這樣做嗎?對編譯好的程序集執行此操作可能不是微不足道的,儘管像Mono.Cecil這樣的工具可以提供幫助。您將不得不實際走過每個方法,並檢查IL指令以調用相關屬性的get和set方法。它可能並不是那麼糟糕,特別是如果你使用Cecil而不是System.Reflection。塞西爾也快得多,因爲它將程序集視爲文件,而不是將它們加載到應用程序域中。

如果你想在項目的實際源代碼上運行它,事情會有很大的不同。我對Visual Studio外接程序瞭解不多,但可以通過編程方式調用「查找所有引用」命令並使用結果。

在System.CodeDom中可能還有些東西可以提供幫助。看起來您可以使用CodeParser將代碼解析爲CodeCompileUnit,然後從那裏遍歷所有方法中的所有語句,並檢查相關的CodePropertyReferenceExpression

相關問題