2015-06-12 53 views
17

這個問題可能看起來有點愚蠢或奇怪,但我已經聽說了很多關於.NET CLR,JIT編譯器以及它如何工作等等等等......但是現在我想知道它究竟位於何處或託管什麼。.NET運行時(CLR),JIT編譯器位於何處?

它是 -

  • 託管作爲Windows操作系統的一部分,當我們真正安裝.NET Framework?

OR

  • 這是一些.exe文件,我們可以在任務管理器中看到

我找這個詳細的答案的一部分。有人可能會框架這個問題爲「Windows操作系統下如何觸發/執行.NET可執行文件.NET運行庫裏面?

+0

如果冰箱通過使用小精靈或通過物理定律來冷卻它真的非常重要嗎? :-) – xanatos

+0

請參閱http://stackoverflow.com/a/30377175/613130關於DNX如何工作以及它如何與.NET運行時不同的解釋......連接到問題 – xanatos

+1

@xanatos那麼,如果你想要成爲精靈之一,我會說這非常重要。 – atlaste

回答

19

它的確切位置位於或託管

這只是一個普通的DLL,你會發現早在C中的它的x86版本:\ WINDOWS \ Microsoft.NET \框架\ V4。 0.30319 \ clrjit.dll。 x64版本位於Framework64目錄中。 .NET v2版本具有不同的名稱mscorjit.dll,可以在v2.0.50727目錄中找到它。

它根本沒有「託管」,操作系統完全不知道它存在。 CLR知道如何定位和加載它。必然如此,CLR決定何時開始一個計劃。它只是將DLL名稱硬編碼並使用LoadLibrary(「clrjit.dll」)加載它,GetProcAddress(「getJit」)來獲取工廠函數。一些你可以在CoreCLR源代碼中看到的東西,儘管在那個CLR版本中抖動不再是一個獨立的DLL。

你可以看到CLR與資源管理器,以及再次只是一個普通的DLL。它是v4版本中的clr.dll,v2版本中的mscorwks.dll和mscorsvc.dll。兩個不同的垃圾收集器,「wks」是工作站版本,「svc」是服務器版本。比較<gcServer>配置文件條目。

這將問題轉移到「CLR如何加載?」這是c:\ windows \ syswow64 \ mscoree.dll的工作,當您在EXE項目中定位到x64時,您將使用c:\​​ windows \ system32 \ mscoree.dll。每個.NET程序集都有5或9個字節的非託管代碼,可跳入該DLL。可以是_CorExeMain或_CorDllMain,這取決於程序集是作爲exe還是庫構建的。 mscoree.dll查看程序集中的元數據,並確定CLR需要加載哪個版本才能正確執行。

更多的詭計正在進行中,我剛剛發佈了您要求的10,000英尺視圖。如果您對此感興趣,那麼您可能想了解關於custom CLR hosting的更多信息,以便看到幕後的男士。

16

Windows操作系統中如何觸發/ .NET執行可執行文件運行 .NET運行庫裏面?

每個.NET託管的程序集或可執行文件都有特殊的CLR頭文件,通過在ILDASM中查看程序集可以看到這個頭文件,這個頭文件指向需要加載的運行時版本,另外還有Image部分和Import Address Table,指出需要加載的內容:

----- Image sections: 
Import Address Table 
DLL : mscoree.dll 
      0x00002000 Import Address Table 
      0x0000a37e Import Name Table 
      0   Time Date Stamp 
      0   Index of First Forwarder Reference 

      0x0000 _CorDllMain 

----- CLR Header: 
Header size:      0x00000048 
Major runtime version:    0x0002 
Minor runtime version:    0x0005 
0x00003184 [0x00007078] address [size] of Metadata Directory:   
Flags:        0x00000001 
Entry point token:     0x00000000 
0x00000000 [0x00000000] address [size] of Resources Directory:  
0x00000000 [0x00000000] address [size] of Strong Name Signature:  
0x00000000 [0x00000000] address [size] of CodeManager Table:   
0x00000000 [0x00000000] address [size] of VTableFixups Directory:  
0x00000000 [0x00000000] address [size] of Export Address Table:  
0x00000000 [0x00000000] address [size] of Precompile Header: 

當由操作系統,mscoree.dll(或墊片)跑被加載,並且它是引導程序至clr.dllclrjit.dll用於和上述.NET 4.0,或mscordacwks.dllmscorjit.dll爲或低於NET 2.0,這是運行時和JIT。您可以看到,本機dll入口點被指示爲類庫的_CorDllMain方法,而_CorExeMain表示可執行文件,它負責加載和入口點的入口。他們反過來會在託管環境中調用您的應用程序入口點。

0

這是基於我的理解,並會引導你對你的回答,但可能不會完全刷新。

位於以下位置的EXE/DLL文件組成DOTNET的運行庫(CLR等):

C:\Windows\Microsoft.NET\Framework // for the 32 bit runtime 
C:\Windows\Microsoft.NET\Framework64 // for the 64 bit runtime 

在那裏,你有不同的版本,如2.0.50727,3.0 ,3.5和4.0.30319(我今天系統上的版本)。

這是MSBuild以及在IIS中註冊的文件所在的位置和運行位置。

我不知道這是否會在運行時被Windows託管,或者是否有實際的EXE可以附加到調試器並在任務管理器中查看。

希望這可以爲您提供更多的見解。