System.Math.Abs​​()调用本机方法System.AppDomain.GetId()?

时间:2016-12-15 17:10:43

标签: c# .net visual-studio clr

我的条件断点有时工作正常,有时会失败,并出现以下错误:

  

断点的条件无法执行。条件是'Math.Abs​​(-4.36767421599683 -x)< 1E-5' 。返回的错误是'评估方法System.Math.Abs​​()调用本机方法System.AppDomain.GetId()。不支持在此上下文中评估本机方法。'。

  1. 它如何只在某些时候起作用?每次运行时条件断点代码都不一样,是否会发生运行时技巧?
  2. 如果有的话,为什么Abs()的任何版本的代码都会调用AppDomain.GetId() - 这绝对是纯粹的算法?
  3. .NET参考源显示方法extern public static double Abs(double)。这是不是意味着始终原生?怎么可能有用?

1 个答案:

答案 0 :(得分:1)

首先,您需要知道调试器评估不能调用本机方法。 (如果不是real func eval,它依赖它,但即使它不是真正的功能,我们也会看到它不完全正确但等待......)

  

它如何只在某些时候起作用?每次运行时条件断点代码都不相同,是否会发生运行时技巧?

是的,这很奇怪,但也可能。调试器评估程序实际上能够获取应用程序域ID,但有时会发生一些错误,然后您将获得该异常。

  

如果有的话,为什么Abs()的任何版本的代码都会调用AppDomain.GetId() - 它绝对是纯粹算术的?

我非常确定这个电话不仅与Math.Abs有关。

  

.NET参考源显示方法extern public static double Abs(double)。这是不是意味着它总是原生的?怎么会有用?

因为对于某些本机方法,调试器评估程序具有以特殊方式处理它的钩子。 Math.Abs就是其中之一。

我尝试在Visual Studio中重现它,但没有成功。 (VS 2017)

尝试在Watch Window中评估相同的表达式(后缀为nse)并告诉我你是否仍然得到异常。

只是为了向您展示尝试评估调用本机代码的方法的示例:(阅读错误消息)

enter image description here

还有一件事,尝试在其他版本的Visual Studio中进行评估。