好吧,您可以在 SSCLI 的源代码中四处寻找。但我想那不是你想要的:-)
但是,您可以缩小 plain 的误报范围findstr /s /i "pow" *.*
。
您将从反编译(或反汇编,如果您愿意的话)System.Math
类开始。您可以在 中找到它,如果您不知道mscorlib.dll
,MSDN会告诉您。
如果这样做,您将看到该方法实际上并没有在那里定义主体,而只是签名。不过,它有MethodImplAttribute
分配的。其中具有 的价值MethodImplOptions.InternalCall
。再一次,看 MSDN告诉你,这种方法是
“调用是内部的,即调用的是
在公共语言运行库中实现的方法。” (强调补充)。
这应该给你一个重要的提示:它可能是用 C 或更像 C++ 实现的,因为那是用于实现 CLR 本身的语言。
知道这一点后,您可以搜索 SSCLI 的所有 C++ 源文件。
findstr /s /i "pow" *.cpp
这大大缩小了点击范围,但仍然有很多东西。知道现在是试验的时候了,比如让搜索区分大小写,只查找整个单词(排除“power”之类的东西)。
findstr /s /r "\<Pow\>" *.cpp
在本例中,这样做只会返回两个命中:
clr\src\classlibnative\float\comfloat.cpp:FCIMPL2_VV(double, COMDouble::Pow, double x, double y)
clr\src\vm\ecall.cpp: FCFuncElement("Pow", COMDouble::Pow)
输出几乎把它泄露了:Pow
似乎与 有某种关系COMDouble::Pow
,这也是 show 。
坦率地说,我不记得我是如何真正InterallCall
想到可以在 中找到 / instrinct 函数(或查找表,如果你愿意的话)的知识clr\src\vm\ecall.cpp
,但如果我需要再做一次,以上是我会做的。
为了补充 Hans 对您研究 SSCLI 的问题的评论,我想说,总的来说,它总是具有教育意义,如果您足够极客,甚至可以“娱乐”,阅读和探索其他代码库。特别是当它们与您当前工作的技术领域相关时。我想很多人一直在探索 BCL 和其他 .NET 库,使用反编译或公共可用资源,甚至有评论。但是 CLR 本身也很有趣,即使 SSCLI 已经过时了。恕我直言,另一个有趣的事情是随 Visual Studio 安装的 CRT(C/C++ 运行时库)源(例如C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt
)。