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

Oli*_*Oli 7 .net c# clr visual-studio

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

断点的条件无法执行.条件是'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).这是不是意味着它总是原生的?它怎么可能工作?

Dud*_*eti 2

首先,您需要知道调试器评估不能调用本机方法。(好吧,这取决于它是否是真正的 func eval,但即使它不是真正的 func eval,我们也会看到它并不完全正确,但等等......)

怎么它只在某些时候起作用?是否存在运行时欺骗,每次运行时条件断点代码都不相同?

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

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

我很确定这个电话不仅仅与Math.Abs.

.NET 参考源显示了一种方法extern public static double Abs(double)。这是否意味着它始终是本地的?它怎么可能起作用呢?

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


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

尝试在监视窗口(后缀为 ,nse)中计算相同的表达式,并告诉我是否仍然出现异常。

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

在此输入图像描述

一件事,尝试在其他版本的 Visual Studio 中评估它。