如何以编程方式检查项目中是否使用了变量?

时间:2008-09-25 23:21:23

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

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

5 个答案:

答案 0 :(得分:3)

查找所有参考文献是您的朋友。

答案 1 :(得分: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

答案 2 :(得分:0)

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

你为什么要以编程方式这样做?您知道Visual Studio具有“查找所有引用”功能,可以为您执行此操作。

答案 3 :(得分:0)

Reflector具有Analyze功能。或者,这是你想要的某种运行时功能吗?

答案 4 :(得分:0)

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

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

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