Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何查看在.NET程序集中以编程方式调用哪些方法?_C#_Reflection - Fatal编程技术网

C# 如何查看在.NET程序集中以编程方式调用哪些方法?

C# 如何查看在.NET程序集中以编程方式调用哪些方法?,c#,reflection,C#,Reflection,长话短说,如果我调用某些LINQ方法,我使用的框架将抛出ExecutionEngineeException。与使用反射查看程序集中定义了哪些类型类似,我希望能够查看程序集中实际调用了哪些方法 我知道有独立的工具可以做到这一点,但我想在签入过程中轻松运行此检查,如果发现其中任何一个,则生成过程将失败。如果我正确理解您的问题 您有一个第三方Linq提供程序,并且该Linq提供程序不支持您可以用Linq语法表达的所有内容,如果不支持Linq语句,它将抛出运行时错误……正确吗 如果是这样,那么在编译/构

长话短说,如果我调用某些LINQ方法,我使用的框架将抛出ExecutionEngineeException。与使用反射查看程序集中定义了哪些类型类似,我希望能够查看程序集中实际调用了哪些方法


我知道有独立的工具可以做到这一点,但我想在签入过程中轻松运行此检查,如果发现其中任何一个,则生成过程将失败。

如果我正确理解您的问题

您有一个第三方Linq提供程序,并且该Linq提供程序不支持您可以用Linq语法表达的所有内容,如果不支持Linq语句,它将抛出运行时错误……正确吗

如果是这样,那么在编译/构建时识别不受支持的Linq语句就相当困难了,通过静态分析,您需要解析代码来识别它

当然,有一种不同的方法,那就是使用单元测试,编写单元测试来执行代码,并从构建服务器运行测试,如果测试失败,则构建失败。您还可以使用代码覆盖率工具来确定测试覆盖了多少代码,您也可以在类级别上这样做

您可以使用用户或(非托管)来检查运行时发生的情况。这是分析器通常做的事情。反射API无法为您提供运行时信息

更一般地说,调用的内容取决于程序状态,在运行(即在构建期间)之前,您无法访问它,要知道实际调用的内容,您需要运行整个程序,为它提供您通常提供的所有输入,然后才能找到调用的内容。当然,如果您提供不同的输入,那么调用的内容也可能不同

我在上面的段落中使用了广义的“输入”。例如,时钟的当前值也可以被视为输入(当然,如果软件以任何形式使用它)

更新 根据您的说明,您可以使用方法来检查方法体,并找出它们可能调用的内容


您可能也会发现有用。

过时与
true
一起使用会导致生成错误。@SimonWhitehead OP希望禁止使用LINQ方法,因此它们不能标记为
过时。
。我发现最适合您需要的东西是:。@HansPassant这不是某种随机崩溃;在构建iOS设备时,这是MonoTouch中的一个已知问题(因为iOS需要提前编译)。因此,我不需要调试ExecutionEngineeException;我只需要防止在设备上编译时不支持的代码被检入;我只是想确保它不会在程序集中定义的任何方法的任何地方被潜在调用。像Reflector这样的工具似乎能够发现这些信息。GetMethodBody和MethodBody类似乎正是我所需要的,非常感谢。@vargonian注意,您可能需要mono.cecil库来“decypher”MSIL的字节流。光靠反射API是不够的。有关详细信息,请参见答案中的最后一个链接。好吧,详细信息并不重要,但我使用的是Unity游戏引擎,它使用MonoTouch,当在iOS设备上编译时,如果在代码中的任何位置调用IEnumerable.OrderBy(),它将在运行时失败。我会喜欢并更喜欢单元测试解决方案,但不幸的是,失败只会发生在iOS设备上,而我们的单元测试不是从实际设备上运行的。