ไฟล์ DLL คืออะไรและทำงานอย่างไร


224

ไฟล์ DLL ทำงานอย่างไร ดูเหมือนจะมีพวกเขาจำนวนมากที่น่ากลัว แต่ฉันไม่รู้ว่าพวกเขาคืออะไรหรือทำงานอย่างไร

ดังนั้นการจัดการกับพวกเขาคืออะไร?


6
เนื่องจากมีการติดแท็กกับ Windows เท่านั้นและคำถามนี้เขียนขึ้นในปี 2551 มันคุ้มค่าที่จะกล่าวถึงว่า dll ทุกวันนี้ทำงานบน Mac และ Linux ด้วย. NET Core
Jim Aho

คำตอบ:


288

DLL คืออะไร

Dynamic Link Libraries (DLL) เป็นเหมือน EXE แต่ไม่สามารถเรียกใช้งานได้โดยตรง พวกมันคล้ายกับไฟล์. so ใน Linux / Unix กล่าวคือ DLLs เป็นการนำ MS ไปใช้กับไลบรารีที่แบ่งใช้

DLLs นั้นเหมือนกับ EXE มากซึ่งรูปแบบไฟล์นั้นเหมือนกัน ทั้ง EXE และ DLL จะขึ้นอยู่กับรูปแบบไฟล์ Portable Executable (PE) ที่กำลังยังสามารถมีส่วนประกอบ COM และ. NET ห้องสมุด

DLL ประกอบด้วยอะไร?

DLL ประกอบด้วยฟังก์ชันคลาสตัวแปร UIs และทรัพยากร (เช่นไอคอนรูปภาพไฟล์ ... ) ที่ EXE หรือ DLL อื่นใช้

ประเภทของห้องสมุด:

ในเกือบทุกระบบปฏิบัติการมีไลบรารี 2 ประเภท ห้องสมุดแบบคงที่และห้องสมุดแบบไดนามิก ใน windows นามสกุลไฟล์มีดังนี้: Static libraries (.lib) และ dynamic libraries (.dll) ข้อแตกต่างที่สำคัญคือสแตติกไลบรารีเชื่อมโยงกับไฟล์สั่งการในเวลารวบรวม ในขณะที่ห้องสมุดเชื่อมโยงแบบไดนามิกจะไม่ถูกเชื่อมโยงจนกว่าจะถึงเวลาทำงาน

เพิ่มเติมเกี่ยวกับห้องสมุดแบบคงที่และแบบไดนามิก:

ปกติแล้วคุณจะไม่เห็นไลบรารี่คงที่ในคอมพิวเตอร์ของคุณเนื่องจากไลบรารี่สแตติกถูกฝังอยู่ภายในโมดูล (EXE หรือ DLL) โดยตรง ไลบรารีแบบไดนามิกเป็นไฟล์แบบสแตนด์อะโลน

สามารถเปลี่ยนแปลง DLL ได้ตลอดเวลาและโหลดเมื่อรันไทม์เมื่อ EXE โหลด DLL อย่างชัดเจนเท่านั้น ไม่สามารถเปลี่ยนไลบรารีแบบคงที่ได้เมื่อรวบรวมภายใน EXE DLL สามารถอัปเดตทีละรายการโดยไม่ต้องอัปเดต EXE

กำลังโหลด DLL:

โปรแกรมโหลด DLL เมื่อเริ่มต้นทำงานผ่าน Win32 API LoadLibrary หรือเมื่อมีการอ้างอิงของ DLL อื่น โปรแกรมใช้ GetProcAddress เพื่อโหลดฟังก์ชันหรือ LoadResource เพื่อโหลดทรัพยากร

อ่านเพิ่มเติม:

โปรดตรวจสอบMSDNหรือWikipediaเพื่ออ่านเพิ่มเติม ยังเป็นแหล่งที่มาของคำตอบนี้


5
น่าจะพูดถึงการนำเข้า lib ที่ไหนสักแห่ง ตกลงฉันจะจากไปแล้ว :)
Adam Mitz

2
ลบผู้ที่ดูเหมือนจะได้รับการแก้ไข ฉันจะได้รับคะแนนสำหรับสิ่งนี้ได้อย่างไร <g>
Adam Mitz

36

DLL คืออะไร

ไฟล์ DLL เป็นไฟล์ไบนารี่ที่สามารถบรรจุรหัสที่สามารถใช้งานได้และทรัพยากรต่าง ๆ เช่นรูปภาพ ฯลฯ ซึ่งแตกต่างจากแอปพลิเคชันซึ่งไม่สามารถเรียกใช้งานได้โดยตรง แต่แอปพลิเคชั่นจะโหลดมันตามและเมื่อจำเป็น

พวกเขาสำคัญหรือไม่

แอปพลิเคชันส่วนใหญ่จะโหลดไฟล์ DLL ที่ต้องการเมื่อเริ่มต้น หากไม่พบสิ่งเหล่านี้ระบบจะไม่สามารถเริ่มกระบวนการได้เลย

ไฟล์ DLL อาจต้องการไฟล์ DLL อื่น ๆ

ในลักษณะเดียวกับที่แอปพลิเคชันต้องการไฟล์ DLL ไฟล์ DLL อาจขึ้นอยู่กับไฟล์ DLL อื่น ๆ หากไม่พบไฟล์ DLL อย่างใดอย่างหนึ่งในสายการพึ่งพาพึ่งพาแอปพลิเคชันจะไม่โหลด นี้จะบั๊กอย่างง่ายดายโดยใช้การพึ่งพาเครื่องมือใด ๆ วอล์คเกอร์เช่นการอ้างอิง Walker

มีอยู่มากมายในโฟลเดอร์ระบบ

ฟังก์ชันการทำงานของระบบส่วนใหญ่มีการเปิดเผยต่อผู้ใช้โปรแกรมในรูปแบบของไฟล์ DLL เนื่องจากเป็นรูปแบบมาตรฐานของการแบ่งปันรหัส / ทรัพยากร ฟังก์ชันการทำงานแต่ละอย่างจะถูกเก็บไว้แยกต่างหากในไฟล์ DLL ที่แตกต่างกันเพื่อให้โหลดไฟล์ DLL ที่จำเป็นเท่านั้นและลดข้อ จำกัด ของหน่วยความจำในระบบ

แอปพลิเคชันที่ติดตั้งยังใช้ไฟล์ DLL

ไฟล์ DLL จะกลายเป็นรูปแบบของฟังก์ชันการแยกทางกายภาพตามที่อธิบายไว้ข้างต้น แอปพลิเคชันที่ดียังพยายามไม่โหลดไฟล์ DLL จนกว่าจะมีความจำเป็นอย่างยิ่งซึ่งจะช่วยลดความต้องการของหน่วยความจำ ซึ่งทำให้แอปพลิเคชันมาพร้อมกับไฟล์ DLL จำนวนมาก

DLL Hell

อย่างไรก็ตามในบางครั้งการอัพเกรดระบบมักจะหยุดโปรแกรมอื่น ๆ เมื่อมีรุ่นที่ไม่ตรงกันระหว่างไฟล์ DLL ที่ใช้ร่วมกันและโปรแกรมที่ต้องการ จุดตรวจสอบระบบและแคช DLL เป็นแนวคิดริเริ่มจาก M $ เพื่อแก้ไขปัญหานี้ แพลตฟอร์ม. NET อาจไม่ประสบปัญหานี้เลย

เราจะรู้ได้อย่างไรว่ามีอะไรอยู่ในไฟล์ DLL?

คุณต้องใช้เครื่องมือภายนอกเช่นDUMPBINหรือ Dependency Walker ซึ่งไม่เพียง แต่จะแสดงฟังก์ชั่นที่ปรากฏต่อสาธารณะ (เรียกว่าการส่งออก) ที่มีอยู่ในไฟล์ DLL และไฟล์ DLL อื่น ๆ ที่มันต้องการและการส่งออกจากไฟล์ DLL เหล่านี้ ขึ้นอยู่กับ

เราจะสร้าง / ใช้พวกเขาได้อย่างไร

ดูเอกสารประกอบการเขียนโปรแกรมจากผู้ขายของคุณ สำหรับ C ++ อ้างถึงLoadLibraryใน MSDN


2
กรุณาเติมประโยคนี้ให้สมบูรณ์"The .NET platform might not face this issue at all."ด้วยเหตุผล ขอบคุณ
Jogi

1
@RehanKhan เริ่มต้นด้วย. NET Framework v2.0 รันไทม์จะโหลดแอสเซมบลีที่คอมไพล์ด้วย. NET version <= ขณะรันไทม์ที่โหลดในปัจจุบัน +. NET ยังแคชไม่พยายามโหลดแอสเซมบลี + หากการโทรก่อนหน้านี้อยู่ในแอสเซมบลี จะใช้แอสเซมบลีที่โหลดแล้ว สรุปฉันคิดว่ามันเป็นการดีกว่าที่จะบอกว่าพวกเขาแก้ไขปัญหาได้โดยการใช้ข้อ จำกัด ที่หนักมากกับสิ่งที่ DLLs ที่รันไทม์ของโปรแกรมจะโหลด (ก่อนที่มันจะยอมแพ้และขอความช่วยเหลือจากคุณ)
Vladislav Martin เมื่อ

14

สมมติว่าคุณกำลังสร้างไฟล์ปฏิบัติการที่ใช้ฟังก์ชั่นบางอย่างที่พบในห้องสมุด

หากไลบรารีที่คุณใช้นั้นเป็นแบบคงที่ตัวเชื่อมโยงจะคัดลอกรหัสวัตถุสำหรับฟังก์ชั่นเหล่านี้โดยตรงจากไลบรารีและแทรกลงในไฟล์เรียกทำงาน

ทีนี้ถ้าเอ็กซีคิวต์นี้รันแล้วมันมีทุกอย่างที่มันต้องการดังนั้นตัวโหลดที่เรียกใช้งานได้จะโหลดมันลงในหน่วยความจำและรันมัน

หากไลบรารี่เป็นแบบไดนามิกตัวเชื่อมโยงจะไม่ใส่รหัสวัตถุ แต่จะแทรกส่วนต้นซึ่งโดยทั่วไปบอกว่าฟังก์ชั่นนี้ตั้งอยู่ในDLLนี้ในตำแหน่งนี้

ทีนี้ถ้าเอ็กซีคิวต์นี้ถูกรันบิตของไฟล์เอ็กซีคิวต์จะหายไป (เช่นสตับ) ดังนั้นตัวโหลดจะต้องผ่านการประมวลผลเพื่อแก้ไขสตับที่หายไป หลังจาก stub ทั้งหมดได้รับการแก้ไขแล้วเท่านั้นที่อนุญาตให้รันได้

หากต้องการดูสิ่งนี้ในการดำเนินการลบหรือเปลี่ยนชื่อ DLL และดูว่าตัวโหลดจะรายงานข้อผิดพลาด DLL ที่ขาดหายไปอย่างไรเมื่อคุณพยายามเรียกใช้ไฟล์ปฏิบัติการ

ดังนั้นชื่อDynamic Link Libraryบางส่วนของกระบวนการเชื่อมโยงจะถูกทำแบบไดนามิก ณ รันไทม์โดยตัวโหลดที่เรียกใช้งานได้

หมายเหตุสุดท้ายหากคุณไม่เชื่อมโยงไปยัง DLL ตัวเชื่อมโยงจะไม่ถูกแทรกโดยตัวเชื่อมโยง แต่ Windows ยังคงให้GetProcAddress API ที่ให้คุณโหลดจุดเข้าใช้งานฟังก์ชัน DLL ได้นานหลังจากที่เริ่มปฏิบัติการได้


12

DLLs (dynamic link libraries) และ SL (shared library, เทียบเท่าภายใต้ UNIX) เป็นเพียงไลบรารีของโค้ดที่สามารถเรียกใช้งานได้ซึ่งสามารถเชื่อมโยงแบบไดนามิกเข้าไปในไฟล์เรียกทำงานขณะทำการโหลด

ไลบรารีแบบสแตติกถูกแทรกลงในไฟล์เรียกทำงาน ณ เวลารวบรวมและได้รับการแก้ไขจากจุดนั้น พวกเขาเพิ่มขนาดของไฟล์ปฏิบัติการและไม่สามารถแชร์ได้

ไลบรารีแบบไดนามิกมีข้อดีดังต่อไปนี้:

1 / พวกเขาจะโหลดในเวลาทำงานมากกว่าเวลารวบรวมเพื่อให้พวกเขาสามารถปรับปรุงเป็นอิสระจากปฏิบัติการ (หน้าต่างแฟนซีและกล่องโต้ตอบทั้งหมดที่คุณเห็นใน Windows มาจาก DLLs ดังนั้นรูปลักษณ์และความรู้สึกของใบสมัครของคุณสามารถเปลี่ยนแปลงได้โดยไม่ต้อง ต้องเขียนใหม่)

2 / เนื่องจากพวกเขาเป็นอิสระรหัสสามารถใช้ร่วมกันในหลาย executables - นี้จะช่วยประหยัดหน่วยความจำตั้งแต่ถ้าคุณใช้ 100 แอพที่มี DLL เดียวอาจมีสำเนาของ DLL ในหน่วยความจำเพียงหนึ่ง

ข้อเสียเปรียบหลักของพวกเขาคือข้อได้เปรียบ # 1 - การที่ DLLs เปลี่ยนเป็นอิสระแอปพลิเคชันของคุณอาจทำให้แอปพลิเคชันของคุณหยุดทำงานหรือเริ่มทำงานในลักษณะที่แปลกประหลาด การกำหนดเวอร์ชัน DLL มีแนวโน้มที่จะไม่ได้รับการจัดการที่ดีภายใต้ Windows และสิ่งนี้นำไปสู่ ​​"DLL Hell" ที่แปลกตา


11

ไฟล์ DLL บรรจุตารางส่งออกซึ่งเป็นรายการสัญลักษณ์ที่สามารถค้นหาได้โดยโปรแกรมเรียก โดยทั่วไปสัญลักษณ์จะทำหน้าที่กับการประชุมแบบ C ( __stcall ) ตารางส่งออกยังมีที่อยู่ของฟังก์ชั่น

ด้วยข้อมูลนี้โปรแกรมเรียกใช้สามารถเรียกใช้ฟังก์ชันภายใน DLL ได้แม้ว่าจะไม่สามารถเข้าถึง DLL ในเวลาคอมไพล์ได้

การแนะนำ Dynamic Link Librariesมีข้อมูลเพิ่มเติม


6

http://support.microsoft.com/kb/815065

DLL เป็นไลบรารีที่มีรหัสและข้อมูลที่สามารถใช้งานได้มากกว่าหนึ่งโปรแกรมในเวลาเดียวกัน ตัวอย่างเช่นในระบบปฏิบัติการ Windows Comdlg32 DLL จะทำหน้าที่เกี่ยวกับกล่องโต้ตอบทั่วไปที่เกี่ยวข้อง ดังนั้นแต่ละโปรแกรมสามารถใช้ฟังก์ชันการทำงานที่มีอยู่ใน DLL นี้เพื่อใช้กล่องโต้ตอบเปิด สิ่งนี้จะช่วยส่งเสริมการใช้รหัสซ้ำและการใช้หน่วยความจำอย่างมีประสิทธิภาพ

โดยใช้ DLL โปรแกรมสามารถทำให้เป็นโมดูลได้ในส่วนประกอบที่แยกกัน ตัวอย่างเช่นโปรแกรมบัญชีอาจขายโดยโมดูล แต่ละโมดูลสามารถโหลดลงในโปรแกรมหลักได้ในขณะใช้งานหากติดตั้งโมดูลนั้น เนื่องจากโมดูลแยกเวลาโหลดของโปรแกรมเร็วขึ้นและโหลดโมดูลเฉพาะเมื่อมีการร้องขอการทำงาน

นอกจากนี้การอัปเดตจะนำไปใช้กับแต่ละโมดูลได้ง่ายขึ้นโดยไม่กระทบกับส่วนอื่น ๆ ของโปรแกรม ตัวอย่างเช่นคุณอาจมีโปรแกรมบัญชีเงินเดือนและอัตราภาษีจะเปลี่ยนไปในแต่ละปี เมื่อการเปลี่ยนแปลงเหล่านี้ถูกแยกเป็น DLL คุณสามารถใช้การปรับปรุงโดยไม่จำเป็นต้องสร้างหรือติดตั้งโปรแกรมทั้งหมดอีกครั้ง

http://en.wikipedia.org/wiki/Dynamic-link_library


2

DLL เป็นรูปแบบไฟล์นามสกุล & ที่รู้จักกันในรูปแบบไฟล์“ dynamic link library” ที่ใช้สำหรับเก็บรหัสและขั้นตอนต่าง ๆ สำหรับโปรแกรม Windows ซอฟต์แวร์และเกมทำงานบนฐานของไฟล์ DLL; ไฟล์ DLL ถูกสร้างขึ้นเพื่อให้แอปพลิเคชันหลายตัวสามารถใช้ข้อมูลของพวกเขาได้ในเวลาเดียวกัน

หากคุณต้องการได้รับข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ DLL หรือพบข้อผิดพลาดอ่านโพสต์ต่อไปนี้ https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

DLLs (Dynamic Link Libraries) มีทรัพยากรที่ใช้โดยแอพพลิเคชั่นหรือบริการอย่างน้อยหนึ่งรายการ พวกเขาสามารถมีคลาสไอคอนสตริงวัตถุอินเทอร์เฟซและอะไรก็ได้ที่นักพัฒนาจะต้องเก็บยกเว้น UI


3
พวกเขาสามารถจัดเก็บ UI และหลาย ๆ โปรแกรมทำเช่นนี้ ตัวอย่างเช่นสแน็ปอิน
Brian R. Bondy

1

ตามที่ Microsoft

(DLL) ไลบรารีลิงก์แบบไดนามิกคือไฟล์ที่มีข้อมูลรหัสหรือทรัพยากรที่จำเป็นสำหรับการใช้งานแอปพลิเคชัน ไฟล์เหล่านี้เป็นไฟล์ที่สร้างขึ้นโดยระบบนิเวศของ windows และสามารถใช้ร่วมกันระหว่างแอปพลิเคชันสองรายการขึ้นไป

เมื่อโปรแกรมหรือซอฟต์แวร์ทำงานบน Windows แอปพลิเคชันส่วนใหญ่ทำงานอย่างไรนั้นขึ้นอยู่กับไฟล์ DLL ของโปรแกรม ตัวอย่างเช่นหากแอปพลิเคชันเฉพาะมีหลายโมดูลดังนั้นแต่ละโมดูลจะโต้ตอบกันอย่างไรโดยไฟล์ Windows DLL

หากคุณต้องการคำอธิบายโดยละเอียดให้ตรวจสอบทรัพยากรที่มีประโยชน์เหล่านี้

สิ่งที่เป็นไฟล์ dll , เกี่ยวกับไฟล์ DLL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.