2010-11-09 32 views
2

我在.net中有一個類庫項目,說「A」,它在構建時會創建一個dll,即「A.dll」。我有另一個項目說「B」,這個項目包含的dll「A.dll」的參考。當我在B中添加A的引用時究竟發生了什麼?任何人都可以告訴我在編譯期間和運行期間會發生什麼?當你在你的項目中添加一個dll的引用時,會發生什麼.net

+0

基本上來自應用程序。 B你可以在編譯時使用A.dll的Public成員 – 2010-11-09 08:41:28

回答

8

A.dll被編譯器用來結合任何使用指令和別名來執行類型解析。當找到這些類型時,IL中將包含一個標識爲的文件,該文件在A.dll中。如果完全沒有使用A.dll,則參考文件將被無聲地丟棄。

沒有代碼被複制 - 只有合格的名稱等 - 因此您仍然需要將A.dll與B.dll(或GAC)一起部署。

在運行時,如果找到標記爲A.dll中的某個類型,「fusion」將嘗試加載並驗證A.dll(這裏有複雜的規則和可選的間接指針) - 一旦加載,它將解析指定的類型並繼續(使用A.dll中的類型)。

+0

嘿Marc非常感謝你對此的回覆.. – samar 2010-11-23 09:40:12

+0

Marc Marc在這裏只有1個問題。如果A.dll中的名稱空間已包含在B.dll的類的頂部(藉助「using」關鍵字),但是沒有其他任何操作完成,即類中沒有使用該名稱空間的類,或者在整個A.dll中?這個DLL會被丟棄嗎? – samar 2010-11-25 05:52:21

+0

@samar - 這不算作「正在使用」,所以是的,它會被丟棄。 – 2010-11-25 06:03:43

2

目前還不清楚您要查找的細節級別,但是在非常基本的級別上,編譯器會檢測您是否實際使用來自A.dll的任何代碼。如果沒有,那麼添加程序集引用的事實對生成的代碼沒有任何影響。

如果您使用的是A.dll的代碼,編譯器會在清單中爲項目B生成的程序集添加對A.dll的引用。如果您查看生成的清單(使用像ildasm.exe這樣的工具)你會看到參考。事情是這樣的:

.assembly extern A 
{ 
    .ver 1:0:0:0 
} 

在運行時,.NET程序集加載器將確保A.DLL被載入根據需要,利用各種規則,試圖找到A.DLL適當副本(看在全球程序集緩存,探測本地目錄等)加載程序將負責實際加載引用的程序集到內存中,並執行任何必要的工作以確保代碼實際上可以被調用。

相關問題