【问题标题】:How do you check if a variable is used in a project programmatically?如何以编程方式检查项目中是否使用了变量?
【发布时间】:2008-09-25 23:21:23
【问题描述】:

在 VB.NET(或 C#)中,我如何以编程方式确定 helper.vb 类中的公共变量是否在项目中的任何位置使用?

【问题讨论】:

  • 一种非编程方式:注释掉变量并尝试编译:-)

标签: c# .net vb.net add-in envdte


【解决方案1】:

Find all References 是你的朋友。

【讨论】:

    【解决方案2】:

    来自MSDN

    Find 对象允许您在支持此类操作的环境中搜索和替换文本,例如代码编辑器。

    它主要用于宏录制目的。编辑器的宏记录机制使用 Find 而不是 TextSelection.FindPattern 以便您可以发现全局查找功能,并且因为它通常比使用 TextSelection 对象进行文件查找等操作更有用。

    如果搜索操作是异步的,例如 Find All,则当操作完成时会发生 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
    

    【讨论】:

      【解决方案3】:

      你需要使用反射,这会很复杂。

      为什么要以编程方式执行此操作?您知道 Visual Studio 有一个“查找所有引用”功能可以为您完成这项工作。

      【讨论】:

        【解决方案4】:

        Reflector 具有分析功能。或者,这是您追求的某种运行时功能吗?

        【讨论】:

          【解决方案5】:

          您是说在编译代码之前执行此操作吗?尽管Mono.Cecil 之类的工具可能会有所帮助,但对已编译的程序集执行此操作可能并非易事。您必须实际遍历每个方法并检查 IL 指令以调用相关属性的 get 和 set 方法。但实际上它可能并没有那么糟糕,特别是如果您使用 Cecil 而不是 System.Reflection。 Cecil 也快得多,因为它将程序集视为文件,而不是实际将它们加载到应用程序域中。

          如果您想在项目的实际源代码上运行它,情况会大不相同。我对 Visual Studio 加载项了解不多,但您也许可以通过编程方式调用“查找所有引用”命令并使用结果。

          System.CodeDom 中可能还有一些可以提供帮助的东西。看起来您可以使用CodeParser 将代码解析为CodeCompileUnit,然后从那里遍历所有方法中的所有语句并检查相关的CodePropertyReferenceExpressions。

          【讨论】:

            猜你喜欢
            • 2012-01-30
            • 1970-01-01
            • 2016-12-21
            • 1970-01-01
            • 1970-01-01
            • 2012-07-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多