首页
学习
活动
专区
圈层
工具
发布

SSCLI参考
EN

Stack Overflow用户
提问于 2013-02-01 02:36:47
回答 1查看 216关注 0票数 1

我知道Shared Source Common Language InfrastructureMethodImplOptions枚举。我很有兴趣了解有关.NET运行时是如何实现的更多信息。

例如,在他对以下问题的回答中;Hans Passant在clr/src/vm/ecall.cpp:How is Math.Pow() implemented in .NET Framework?中讨论了Math.Pow()是如何在C++中实现的。我的问题是:你是如何知道如何在文件中查找的?是因为你对代码太熟悉了,还是有什么参考资料?即,说明Math.Pow()是在ecall.cpp中实现的引用

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

在本例中,执行此操作将仅返回两个命中:

代码语言:javascript
复制
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++运行时库)源代码。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14632772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档