我知道Shared Source Common Language Infrastructure和MethodImplOptions枚举。我很有兴趣了解有关.NET运行时是如何实现的更多信息。
例如,在他对以下问题的回答中;Hans Passant在clr/src/vm/ecall.cpp:How is Math.Pow() implemented in .NET Framework?中讨论了Math.Pow()是如何在C++中实现的。我的问题是:你是如何知道如何在文件中查找的?是因为你对代码太熟悉了,还是有什么参考资料?即,说明Math.Pow()是在ecall.cpp中实现的引用
发布于 2013-02-01 20:37:38
那么,您可以查看一下SSCLI的源代码。但我猜这不是你想要的:-)
但是,您可以缩小普通findstr /s /i "pow" *.*的误报范围。
您可以从反编译(或反汇编,如果您喜欢) System.Math类开始。你可以在mscorlib.dll中找到它,MSDN会在你不知道的情况下告诉你。
如果您这样做了,您将看到该方法实际上并没有在其中定义主体,而只是定义了签名。不过,它已经分配了MethodImplAttribute。它承载着MethodImplOptions.InternalCall的值。再看一下MSDN tells you,这个方法是
“该调用是内部调用,即它调用在公共语言运行库中实现的方法。”(已添加强调)。
这应该会给你一个重要的提示:它可能是用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。
坦率地说,我不记得我是如何真正想出在clr\src\vm\ecall.cpp中可以找到InterallCall /指令函数(或者那里的查找表)的知识的,但如果我再次需要的话,上面就是我会做的。
为了补充Hans对你关于学习了SSCLI的问题的评论,我想说,一般来说,阅读和探索其他代码库总是有教育意义的,如果你够极客的话,甚至是“娱乐”的。特别是,当它们与您当前工作的技术领域相关时。我猜很多人都在探索BCL和其他.NET库,要么使用反编译,要么使用公共可用的源代码,这些源代码甚至有注释。但CLR本身也很有趣,即使知道SSCLI有点过时了。另一件有趣的事情,我的意思是,是与Visual Studio (例如C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt)一起安装的CRT (C/C++运行时库)源代码。
https://stackoverflow.com/questions/14632772
复制相似问题