2011-09-06 88 views
3

假設我在我的解決方案中有一個C#Windows類庫,並將其構建在我的VS2010 IDE中。 在我的bin目錄這裏的輸出是X.dll什麼時候生成MSIL?

1) X.dll不會在這個階段,但「壓縮字節代碼」包含MSIL。
這是真的嗎?

2)該「壓縮字節碼」以某種方式轉換爲MSIL。
這是什麼時候發生的?

3)當訪問X.dll時,CLR的JIT編譯器將需要轉換的部分MSIL轉換爲機器碼。
我在這最後的部分很好嗎?

任何人都可以幫助填補我在這裏的理解空白嗎?

+0

+1因爲我從未見過「壓縮字節碼」。我認爲它與MSIL的關係就像機器代碼和彙編語言的關係,對吧? – xanatos

+0

我做了一些搜索。我發現了一個壓縮字節代碼的單引用:http://stackoverflow.com/questions/2665882/how-to-create-msil-files-from-dll-exe/2665891#2665891 – xanatos

回答

2

X.dll在使用Visual Studio進行構建後包含MSIL字節碼。你可以用ildasm反彙編來證明這一點。

在程序集加載和代碼的實際執行之間的某個時間,MSIL被轉換爲本機代碼。我不熟悉這是做什麼,但我會懷疑在組裝負載。

+2

我的應用程序的exe文件包含C#碼。你可以通過反射器分解來證明這一點。 :-P @xanatos錯過了笑臉? – CodeCaster

+0

@Codecaster對不起:-)是的......它永遠不會是我讀過的最奇怪的東西:-) – xanatos

+0

MSIL字節碼和MSIL之間的任何區別? – FuzzyFrog

0

要建立在黑暗獵鷹隊的回答上,在第二個問題上,IL代碼(非壓縮字節代碼)在每次首次調用時都由JIT編譯器按方法逐次轉換爲本機代碼。所以,第二個答案就是「當方法第一次訪問時」。字段不受此限制,屬性本身就是僞裝的方法。

至於第三個問題,不,IL在加載時不會被打亂。往上看。

+1

它在被加載的模塊和被調用的方法之間的某處出現。運行時通常會盡可能延遲它,但不能保證它會像第一次訪問一樣遲,特別是當[受限執行區域](https://msdn.microsoft.com/en-us/ library/ms228973%28v = vs.110%29.aspx)和[CriticalFinalizerObjects](https://msdn.microsoft.com/en-us/library/system.runtime.constrainedexecution.criticalfinalizerobject%28v=vs.110%29 .aspx)都參與其中。 –