我在.net中有一個類庫項目,說「A」,它在構建時會創建一個dll,即「A.dll」。我有另一個項目說「B」,這個項目包含的dll「A.dll」的參考。當我在B中添加A的引用時究竟發生了什麼?任何人都可以告訴我在編譯期間和運行期間會發生什麼?當你在你的項目中添加一個dll的引用時,會發生什麼.net
2
A
回答
8
A.dll被編譯器用來結合任何使用指令和別名來執行類型解析。當找到這些類型時,IL中將包含一個標識爲的文件,該文件在A.dll中。如果完全沒有使用A.dll,則參考文件將被無聲地丟棄。
沒有代碼被複制 - 只有合格的名稱等 - 因此您仍然需要將A.dll與B.dll(或GAC)一起部署。
在運行時,如果找到標記爲A.dll中的某個類型,「fusion」將嘗試加載並驗證A.dll(這裏有複雜的規則和可選的間接指針) - 一旦加載,它將解析指定的類型並繼續(使用A.dll中的類型)。
2
目前還不清楚您要查找的細節級別,但是在非常基本的級別上,編譯器會檢測您是否實際使用來自A.dll的任何代碼。如果沒有,那麼添加程序集引用的事實對生成的代碼沒有任何影響。
如果您使用的是A.dll的代碼,編譯器會在清單中爲項目B生成的程序集添加對A.dll的引用。如果您查看生成的清單(使用像ildasm.exe這樣的工具)你會看到參考。事情是這樣的:
.assembly extern A
{
.ver 1:0:0:0
}
在運行時,.NET程序集加載器將確保A.DLL被載入根據需要,利用各種規則,試圖找到A.DLL適當副本(看在全球程序集緩存,探測本地目錄等)加載程序將負責實際加載引用的程序集到內存中,並執行任何必要的工作以確保代碼實際上可以被調用。
相關問題
- 1. 當你不加入你的主題時會發生什麼?
- 2. Erlang:當你f()中的一個Pid時會發生什麼?
- 3. 當你產生一個循環時會發生什麼?
- 4. 當你引用一個未定義的數組元素時,會發生什麼?
- 5. 當你爲自己添加一個列表時會發生什麼?
- 6. 當你突然投入大型項目時,你會做什麼?
- 7. 當你運行一個程序時會發生什麼?
- 8. 當你在列表中調用`append`時會發生什麼?
- 9. 當你在android中調用getSystemService(WIFI_SERVICE)時會發生什麼?
- 10. 你怎麼做到這一點,當你按下一個鍵會發生什麼
- 11. 當你添加一個類到NSMutableArray並且你改變了這個對象和數組時,會發生什麼?
- 12. 當你開始思考一個編程項目時,你首先會做什麼?
- 13. 當你調用一個線程的中斷()時會發生什麼?
- 14. 當你同時觸摸兩個按鈕時會發生什麼
- 15. 爲什麼在你的項目中創建一個文件夾來保存你引用的dll?
- 16. 當你調用新的Object()時會發生什麼?
- 17. 當你調用UItableview的重裝兩次時會發生什麼
- 18. 當你增加數組時,會發生什麼。 {A [in.nextInt()] ++;}
- 19. 當你在Bash中執行「ls」時會發生什麼
- 20. 當你在瀏覽器中輸入URL時會發生什麼
- 21. 當你在進程中點擊ctrl + z時會發生什麼?
- 22. 當你改變一個用getter檢索的對象時會發生什麼?
- 23. 當你增加一個整數超過其最大值時會發生什麼?
- 24. 當你在QtCreator中推廣一個小部件時會發生什麼?
- 25. 當你使用unbind()失敗時會發生什麼?
- 26. 當你調用object .__ new__時會發生什麼?
- 27. 當你在unix shell上鍵入時會發生什麼
- 28. 當你插入一個新的USB設備時會發生什麼?
- 29. 當你等待一個失敗的任務時會發生什麼
- 30. 當你聲明一個具有空邊界的數組時會發生什麼
基本上來自應用程序。 B你可以在編譯時使用A.dll的Public成員 – 2010-11-09 08:41:28