簡體   English   中英

DLL中的內容是什么?

[英]What is in a DLL and how does it work?

我總是在我的C#代碼中引用DLL,但它們仍然有些神秘,我想澄清一下。 這是關於DLL的問題的一種大腦轉儲。

我理解DLL是一個動態鏈接庫,這意味着另一個程序可以在運行時訪問該庫以獲得“功能”。 但是,請考慮以下帶有Web.dllBusiness.dll ASP.NET項目( Web.dll是前端功能,它引用了類型和方法的Business.dll )。

  1. Web.dll在什么時候動態鏈接到Business.dll 在使用Word(等)時,你會注意到很多Windows硬盤驅動程序看似小的任務,我認為Word正在關閉並動態鏈接其他DLL的功能?

    1A。 另外,什么加載和鏈接DLL - 操作系統或某些運行時框架,如.NET框架?

    1B。 什么是“鏈接”的過程? 是否進行兼容性檢查? 加載到同一個內存? 鏈接實際意味着什么?

  2. 什么實際執行DLL中的代碼? 它是由處理器執行還是在處理器理解DLL中的代碼之前還有另一個轉換或編譯階段?

    2A。 對於使用C#.NET構建的DLL,運行它的是什么:.NET框架或操作系統直接?

  3. Linux中的DLL是否可以在Windows系統上運行(如果存在這樣的事情),或者它們是否特定於操作系統?

  4. DLL是否特定於特定框架? 使用C#.NET構建的DLL是否可以由使用Borland C ++構建的DLL使用?

    4A。 如果4的答案是“否”那么DLL的重點是什么? 為什么各種框架不使用自己的格式來鏈接文件? 例如:.NET內置的.exe知道.abc的文件類型可以鏈接到其代碼中。

  5. 回到Web.dll / Business.dll示例 - 為了獲得類型的客戶,我需要從Web.dll引用Business.dll 這必須意味着Business.dll包含某種關於客戶類實際是什么的規范。 如果我在Delphi中編譯了我的Business.dll文件:C#會理解它並能夠創建一個客戶類,或者是否有某種標題信息或者說“對不起你只能用另一個人Delphi DLL“?

    5A。 同樣適用於方法; 我可以在DLL中編寫CreateInvoice()方法,在C ++中編譯,然后從C#訪問並運行它嗎? 什么阻止或允許我這樣做?

  6. 關於DLL劫持的主題,當然,替換(壞)DLL必須包含確切的方法簽名和類型作為被劫持的方法。 我想如果你能找到原始DLL中可用的方法,那就不難做到。

    6A。 在我的C#程序中決定我是否可以訪問另一個DLL? 如果我的被劫持的DLL包含與原始DLL完全相同的方法和類型但是它是用另一種語言編譯的,它會起作用嗎?

什么是DLL導入和DLL注冊?

首先,您需要了解兩種非常不同的DLL之間的區別。 Microsoft決定使用相同的文件擴展名(.exe和.dll)同時使用.NET(托管代碼)和本機代碼,但托管代碼DLL和本機DLL在內部非常不同。

1)web.dll在什么時候動態鏈接到business.dll? 在使用Word等時,你會注意到Windows硬盤驅動器中有很多看似小的任務,我認為這個Word會在其他DLL的功能中動態鏈接並動態鏈接?

1)在.NET的情況下,當執行嘗試從DLL訪問任何內容的第一個方法時,DLL通常按需加載。 這就是為什么如果無法加載DLL,您可以在代碼中的任何位置獲取TypeNotFoundExceptions。 當像Word這樣的東西突然開始大量訪問硬盤時,它可能會交換(將已交換到磁盤的數據轉換為在RAM中騰出空間)

1a)另外什么加載和鏈接DLL - O / S或某些運行時框架,如.Net框架?

1a)在托管DLL的情況下,.NET框架是加載,JIT編譯(將.NET字節碼編譯成本機代碼)並鏈接DLL。 在本機DLL的情況下,它是操作系統的一個組件,用於加載和鏈接DLL(不需要編譯,因為本機DLL已經包含本機代碼)。

1b)“鏈接”的過程是什么? 檢查是否有兼容性? 加載到同一個內存? 鏈接實際意味着什么?

1b)鏈接是指調用代碼中的引用(例如方法調用)到DLL中的符號(例如方法)被DLL中的事物的實際地址替換。 這是必要的,因為在將DLL加載到內存之前,無法知道DLL中事物的最終地址。

2)實際執行DLL中的代碼是什么? 它是由處理器執行還是在處理器理解DLL中的代碼之前還有另一個轉換或編譯階段?

2)在Windows上,.exe文件和.dll文件完全相同。 原生.exe和.dll文件包含本機代碼(處理器執行的相同內容),因此無需翻譯。 托管的.exe和.dll文件包含.NET字節碼,這是第一次JIT編譯(翻譯成本機代碼)。

2a)在使用C#.net構建的DLL的情況下運行這個是什么? .Net框架或操作系統直接?

2a)代碼經過JIT編譯后,它的運行方式與任何代碼完全相同。

3)說Linux的DLL是否適用於Windows系統(如果存在這樣的東西)或者它們是否特定於操作系統?

3)托管DLL可以按原樣工作,只要兩個平台上的框架都是最新的,並且編寫DLL的人不會故意通過使用本機調用來破壞兼容性。 由於格式不同,原生DLL將無法正常工作(即使內部的機器代碼相同,如果它們都屬於同一處理器平台)。 順便說一句,在Linux上,“DLL”被稱為.so(共享對象)文件。

4)它們是否特定於特定框架? 使用C#.Net構建的DLL是否可以由使用Borland C ++構建的DLL(僅限示例)使用?

4)托管DLL是.NET框架特有的,但自然它們可以與任何兼容的語言一起使用。 只要每個人都使用相同的約定(調用約定(如何在機器代碼級別傳遞函數參數),符號命名等),本機DLL是兼容的

5)回到web.dll / business.dll示例。 要獲得類類型的客戶,我需要從web.dll引用business.dll。 這必須意味着business.dll包含某種客戶類實際上的規范。 如果我已經編譯了我的business.dll文件,比如說Delphi會讓C#理解它並能夠創建一個客戶類 - 或者是否有某種標題信息或者說“嘿抱歉你只能用我的另一個delphi dll” 。

5)托管DLL包含它們包含的每個類,方法,字段等的完整描述。 AFAIK Delphi不支持.NET,因此它會創建本機DLL,而這些DLL不能直接在.NET中使用。 您可能能夠使用PInvoke調用函數,但找不到類定義。 我不使用Delphi,所以我不知道它如何存儲DLL的類型信息。 例如,C ++依賴於包含類型聲明的頭(.h)文件,並且必須與DLL一起分發。

6)關於DLL劫持的主題,當然,替換(壞)DLL必須包含確切的方法簽名,類型是被劫持的類型。 我想如果你能找到原始DLL中可用的方法等,那么這很難做到。

6)實際上,如果你可以輕松切換DLL,這並不難。 代碼簽名可用於避免這種情況。 為了讓某人替換已簽名的DLL,他們必須知道簽名密鑰,它保密。

6a)這里有一個重復的問題,但這可以追溯到我的C#程序決定是否可以訪問另一個DLL的內容? 如果我的被劫持的DLL包含與原始DLL完全相同的方法和類型,但它是在另一個語言中編譯的,它會起作用嗎?

6a)它可以工作,只要它是一個托管DLL,用任何.NET語言編寫。

  • 什么是DLL導入? 和DLL注冊?

“DLL導入”可能意味着很多東西,通常意味着引用DLL文件並使用其中的內容。

DLL注冊是在Windows上完成的,它將DLL文件全局注冊為COM組件,以使它們可供系統上的任何軟件使用。

.dll文件包含可在應用程序中使用的已編譯代碼。

有時,用於編譯.dll的工具很重要,有時則不然。 如果您可以在項目中引用.dll,那么使用哪個工具來編寫.dll的公開函數並不重要。

鏈接發生在運行時,不像靜態鏈接庫,例如您的類,它們在編譯時鏈接。

您可以將.dll視為一個黑盒子,它提供您不希望自己編寫的應用程序所需的內容。 是的,有人理解.dll的簽名可能會創建另一個包含不同代碼的.dll文件,並且您的調用應用程序無法知道其中的差異。

HTH

1)web.dll在什么時候動態鏈接到business.dll? 在使用Word等時,你會注意到Windows硬盤驅動器中有很多看似小的任務,我認為這個Word會在其他DLL的功能中動態鏈接並動態鏈接?

1)我認為你混淆加載鏈接。 鏈接是在測試所有檢查和平衡時確保所要求的內容可用。 在加載時,部分dll被加載到內存中或換出到頁面文件。 這是您看到的高清活動。

動態鏈接與靜態鏈接的不同之處在於,在靜態鏈接中,所有目標代碼都在鏈接時放入主.exe中。 通過動態鏈接,目標代碼被放入一個單獨的文件(dll)中,並在與.exe不同的時間加載。

動態鏈接可以是隱式的(即app鏈接到import lib),也可以是顯式的(即app使用LoadLibrary(ex)加載dll)。

在隱式的情況下,/ DELAYLOAD可用於推遲加載dll,直到應用程序實際需要它為止。 否則,作為進程初始化的一部分,至少將其一部分加載(映射到進程地址空間)。 dll還可以請求在進程處於活動狀態時永遠不會卸載它。

COM使用LoadLibrary加載COM dll。 請注意,即使在隱式情況下,系統也會使用與LoadLibrary類似的內容在進程啟動時或首次使用時加載dll。

2)實際執行DLL中的代碼是什么? 它是由處理器執行還是在處理器理解DLL中的代碼之前還有另一個轉換或編譯階段?

2)Dll包含與.exes類似的對象代碼。 dll文件的格式幾乎與exe文件的格式相同。 我聽說在兩個文件的標題中只有一個不同的位。

對於使用C#.net構建的DLL,.Net框架正在運行它。

3)說Linux的DLL是否適用於Windows系統(如果存在這樣的東西)或者它們是否特定於操作系統?

3)DLL是特定於平台的。

4)它們是否特定於特定框架? 使用C#.Net構建的DLL是否可以由使用Borland C ++構建的DLL(僅限示例)使用?

4)如果采取特殊措施或編寫一些額外的膠水代碼,Dll可以與其他框架互操作。

當公司銷售具有重疊功能的多個產品時,Dll非常有用。 例如,我維護一個光柵i / o dll,該公司使用了30多種不同的產品。 如果您安裝了多個產品,則dll的一次升級可以將所有產品升級為新的柵格格式。

5)回到web.dll / business.dll示例。 要獲得類類型的客戶,我需要從web.dll引用business.dll。 這必須意味着business.dll包含某種客戶類實際上的規范。 如果我已經編譯了我的business.dll文件,比如說Delphi會讓C#理解它並能夠創建一個客戶類 - 或者是否有某種標題信息或者說“嘿抱歉你只能用我的另一個delphi dll” 。

5)根據平台的不同,dll的功能以各種方式呈現,通過.h文件,.tlb文件或.net上的其他方式。

6)關於DLL劫持的主題,當然,替換(壞)DLL必須包含確切的方法簽名,類型是被劫持的類型。 我想如果你能找到原始DLL中可用的方法等,那么這很難做到。

6)dumpbin / exports和dumbin / imports是在.exe和.dll上使用的有趣工具

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM