gpt4 book ai didi

c# - 反编译器如何识别编译常量?

转载 作者:行者123 更新时间:2023-11-30 14:21:25 25 4
gpt4 key购买 nike

我正在使用 ILSpy 反编译 .Net 的程序集并查看代码。当我在 WindowsBase.dll 中浏览 System.Windows.Vector.AngleBetween(Vector, Vector) 的代码时,我偶然发现了一些奇怪的东西。

这是函数的完整代码:

public static double AngleBetween(Vector vector1, Vector vector2)
{
double y = vector1._x * vector2._y - vector2._x * vector1._y;
double x = vector1._x * vector2._x + vector1._y * vector2._y;
return Math.Atan2(y, x) * (180.0 / Math.PI);
}

显然 ILSpy 可以识别 Math.PI,它是一个常量。

这就是Microsoft Docs说到 C# 中的常量:

In fact, when the compiler encounters a constant identifier in C# source code, it substitutes the literal value directly into the intermediate language (IL) code that it produces.

基于此,ILSpy 所做的似乎是不可能的。

注意:即使“使用调试符号中的变量名,如果可用”和“显示调试符号中的信息,如果可用”,也会出现此行为 设置中未选中选项。

最佳答案

正如您在此 ILSpy issue 中看到的那样和相应的pull request ,这是专门为众所周知的值(例如 Math.PI)实现的(硬编码)。

来自 GitHub 问题:

I suppose to calculate pi coefficient by following way: c = Math.PI / constant. If we getting "good" value (equal exactly to 1.0, 2.0, 0.5, 1/180 and so on), we simply replacing it with symbolic expression (Math.PI, Math.PI * 2, Math.PI / 2, Math.PI / 180 and so on).

关于c# - 反编译器如何识别编译常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55618930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com