2013-01-31 20 views
1

我知道共享Source Common Language InfrastructureMethodImplOptions枚舉。我有興趣瞭解更多關於.NET運行時如何實現的信息。SSCLI參考

例如,在他對以下問題的回答中; Hans Passant介紹瞭如何在C++中實現Math.Pow():clr/src/vm/ecall.cpp:How is Math.Pow() implemented in .NET Framework?。我的問題是:你怎麼知道首先查看該文件?是因爲你很熟悉代碼,還是在某個地方有參考?即Math.Pow()實現的參考:ecall.cpp

+1

是的,我研究了SSCLI20知道看看那裏。 –

+0

@Hans Passant,感謝您的評論。如果您願意發佈答案,我會將問題標記爲已回答。 – w0051977

+0

由於我知道它基於.net 2.0,因此SSCLI源過期了。我也明白,SSCLI的目的是讓開發者有機會與其他平臺進行.net移植。是否有更新版本的SSCLI? – w0051977

回答

4

那麼,你可以在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

這大大縮小了命中,但仍然是一個很大的東西。知道現在是時候進行實驗了,比如讓搜索大小寫敏感,並且只查找整個單詞(以排除諸如「權力」之類的內容)。

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,這是秀也。

坦率地說,我不記得我到底是如何想出了知識InterallCall/instrinct功能(或有查找表,如果你會)可以clr\src\vm\ecall.cpp發現,但上面就是我會做,如果我需要再次。

爲了增加漢斯對你關於學習SSCLI的問題的評論,我會說一般情況下它總是教育性的,如果你足夠怪的話,甚至是「娛樂性」,閱讀和探索其他代碼庫。特別是,當它們與您目前正在工作的技術領域相關時。我想很多人都在BCL和其他.NET庫中大肆宣傳,無論是使用反編譯還是公開的可用來源,甚至有評論。但是CLR本身也非常有趣,即使SSCLI已經有點過時了。另一個有趣的事情,即恕我直言,是與Visual Studio一起安裝的CRT(C/C++運行時庫)源(例如C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt)。

+0

+1用於引用findstr。 – w0051977

+0

謝謝,你想確定,你[真的知道](http://stackoverflow.com/q/8844868/21567)野獸雖然:-) –

+0

偉大的東西,感謝**願意分享**。 – Veverke