长话短说,我正在使用一个框架,如果我调用某些 LINQ 方法,它将抛出 ExecutionEngineExceptions。类似于我可以使用反射来查看程序集中定义了哪些类型,我希望能够查看程序集中实际调用了哪些方法。
我知道有独立的工具可以执行此操作,但我想轻松地将此检查作为签入过程的一部分运行,如果发现其中任何一个,则构建过程失败。
长话短说,我正在使用一个框架,如果我调用某些 LINQ 方法,它将抛出 ExecutionEngineExceptions。类似于我可以使用反射来查看程序集中定义了哪些类型,我希望能够查看程序集中实际调用了哪些方法。
我知道有独立的工具可以执行此操作,但我想轻松地将此检查作为签入过程的一部分运行,如果发现其中任何一个,则构建过程失败。
您可以使用Debugging API或Profiling API(非托管)来检查运行时发生的情况。这是分析器通常会做的事情。反射 API 无法为您提供运行时信息。
更一般地说,调用的内容取决于程序状态,并且在运行之前(即在构建期间)您无法访问它,以便能够知道实际调用的内容您需要运行整个事物为其提供所有你通常给它的输入,然后你可能会找出被调用的内容。当然,如果您提供不同的输入,那么调用的内容也可能不同。
在上面的段落中,我在非常广泛的意义上使用了“输入”。例如,时钟的当前值也可以被视为输入(当然,如果软件以任何形状或形式使用它)
更新 根据您的说明,您可以使用GetMethodBody方法检查方法主体并找出它们可能调用的内容。
您也可能会发现这个问题和答案很有用。
如果我正确理解你的问题...
您有一个第 3 方 Linq 提供程序,并且该 Linq 提供程序不支持您可以使用 Linq 语法表达的所有内容,如果不支持 Linq 语句,它将引发运行时错误......对吗?
如果是这样,那么在编译/构建时很难识别不受支持的 Linq 语句,通过静态分析,您需要解析代码来识别它。
当然还有一种不同的方法,那就是使用单元测试,编写单元测试来执行代码,然后从构建服务器运行测试,如果测试失败,则构建失败。您还可以使用代码覆盖率工具来确定测试覆盖了多少代码,您也可以在类级别执行此操作。