1

我知道共享源公共语言基础结构以及MethodImplOptions枚举。我有兴趣了解有关如何实现 .NET 运行时的更多信息。

例如,在他对以下问题的回答中;Hans Passant 在 clr/src/vm/ecall.cpp: How is Math.Pow() in .NET Framework 中谈到了 Math.Pow() 是如何在 C++ 中实现的?. 我的问题是:你怎么知道首先要查看该文件?是因为您非常了解代码还是在某处有参考?即说明 Math.Pow() 在以下位置实现的参考:ecall.cpp

4

1 回答 1

4

好吧,您可以在 SSCLI 的源代码中四处寻找。但我想那不是你想要的:-)

但是,您可以缩小 plain 的误报范围findstr /s /i "pow" *.*

您将从反编译(或反汇编,如果您愿意的话)System.Math类开始。您可以在 中找到它,如果您不知道mscorlib.dllMSDN会告诉您。

如果这样做,您将看到该方法实际上并没有在那里定义主体,而只是签名。不过,它有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)。

于 2013-02-01T12:37:37.637 回答