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


87

ฉันมักจะอ้างถึง DLL ในรหัส C # ของฉัน แต่ก็ยังคงเป็นปริศนาอยู่ซึ่งฉันอยากจะชี้แจง นี่คือคำถามประเภทต่างๆเกี่ยวกับ DLL

ฉันเข้าใจว่า DLL คือไลบรารีที่เชื่อมโยงแบบไดนามิกซึ่งหมายความว่าโปรแกรมอื่นสามารถเข้าถึงไลบรารีนี้ในขณะทำงานเพื่อรับ "ฟังก์ชัน" อย่างไรก็ตามให้พิจารณาโครงการ ASP.NET ต่อไปนี้ที่มีWeb.dllและBusiness.dll( Web.dllคือฟังก์ชันส่วนหน้าและอ้างอิงถึงBusiness.dllประเภทและวิธีการ)

  1. สิ่งที่จุดไม่Web.dllไดนามิกเชื่อมโยงไปยังBusiness.dll? คุณสังเกตเห็นจำนวนมากใน Windows HDD thrashing สำหรับงานที่ดูเหมือนเล็กเมื่อใช้ Word (ฯลฯ ) และฉันคิดว่า Word กำลังจะปิดและเชื่อมโยงฟังก์ชันการทำงานจาก DLL อื่น ๆ แบบไดนามิกหรือไม่?

    1a. นอกจากนี้สิ่งที่โหลดและเชื่อมโยง DLL - OS หรือกรอบเวลาทำงานบางอย่างเช่น. NET framework?

    1b. กระบวนการ "เชื่อมโยง" คืออะไร? มีการตรวจสอบความเข้ากันได้หรือไม่ กำลังโหลดลงในหน่วยความจำเดียวกันหรือไม่? การเชื่อมโยงหมายถึงอะไร?

  2. อะไรเรียกใช้โค้ดใน DLL ได้จริง? โปรเซสเซอร์ได้รับการดำเนินการหรือมีขั้นตอนอื่นของการแปลหรือการคอมไพล์ก่อนที่โปรเซสเซอร์จะเข้าใจโค้ดภายใน DLL หรือไม่

    2a. ในกรณีของ DLL ที่สร้างขึ้นใน C # .NET สิ่งนี้กำลังเรียกใช้สิ่งนี้:. NET framework หรือระบบปฏิบัติการโดยตรง?

  3. DLL จาก Linux ทำงานบนระบบ Windows หรือไม่ (หากมีสิ่งนั้นอยู่) หรือเป็นระบบปฏิบัติการเฉพาะ

  4. DLL มีเฉพาะสำหรับเฟรมเวิร์กเฉพาะหรือไม่ DLL ที่สร้างโดยใช้ C # .NET สามารถใช้โดย DLL ที่สร้างขึ้นด้วยเช่น Borland C ++ ได้หรือไม่

    4a. ถ้าคำตอบของ 4 คือ "ไม่" แล้ว DLL คืออะไร? เหตุใดเฟรมเวิร์กต่างๆจึงไม่ใช้รูปแบบของตัวเองสำหรับไฟล์ที่เชื่อมโยง ตัวอย่างเช่นไฟล์. exe ที่สร้างขึ้นใน. NET รู้ว่าไฟล์ประเภท. abc เป็นสิ่งที่สามารถเชื่อมโยงเป็นรหัส

  5. จะกลับไปWeb.dll/ Business.dllเช่น - จะได้รับประเภทชั้นเรียนของลูกค้าที่ฉันจำเป็นต้องอ้างอิงจากBusiness.dll Web.dllซึ่งต้องหมายความว่าBusiness.dllมีข้อกำหนดบางอย่างเกี่ยวกับคลาสลูกค้า ถ้าฉันรวบรวมBusiness.dllไฟล์ไว้แล้วให้พูดว่า Delphi: C # จะเข้าใจและสามารถสร้างคลาสลูกค้าได้หรือไม่หรือมีข้อมูลส่วนหัวบางประเภทหรือบางอย่างที่ระบุว่า "เดี๋ยวก่อนขอโทษคุณสามารถใช้ฉันจาก Delphi DLL อื่นเท่านั้น" เหรอ?

    5a. เช่นเดียวกับวิธีการ; ฉันสามารถเขียนCreateInvoice()วิธีการใน DLL รวบรวมใน C ++ จากนั้นเข้าถึงและเรียกใช้จาก C # ได้หรือไม่ อะไรที่หยุดหรืออนุญาตให้ฉันทำสิ่งนี้

  6. ในเรื่องของการจี้ DLL แน่นอนว่า DLL ทดแทน (ไม่ดี) ต้องมีลายเซ็นและประเภทของวิธีการที่แน่นอนเหมือนกับที่ถูกแย่งชิง ฉันคิดว่านี่คงไม่ใช่เรื่องยากที่จะทำหากคุณสามารถหาวิธีการที่มีอยู่ใน DLL ดั้งเดิม

    6 ก. มีอะไรในโปรแกรม C # ของฉันกำลังตัดสินใจว่าฉันสามารถเข้าถึง DLL อื่นได้หรือไม่ หาก DLL ที่ถูกไฮแจ็กของฉันมีวิธีการและประเภทเดียวกันกับต้นฉบับ แต่ถูกคอมไพล์เป็นภาษาอื่นจะใช้งานได้หรือไม่

การนำเข้า DLL และการลงทะเบียน DLL คืออะไร?


21
คำถามนี้อาจต้องการคำตอบที่ยาวที่สุดในประวัติศาสตร์ SO
Matti Virkkunen

4
ควรเป็นคำถามแยกกัน 12 คำถาม
Henk Holterman

2
นี่เป็นคำถามที่ยอดเยี่ยม แต่ฉันเห็นด้วยกับ @Chaos และ @Matti จริงๆ คำถามนี้ต้องการการโฟกัสมากขึ้นและสามารถ / ควรแยกออกเป็นคำถามต่างๆ
Chris Thompson

3
มันเป็นการทิ้งสมองเล็กน้อยเมื่อฉันเขียนมัน + ฉันต้องการรวมศูนย์ความรู้ไว้ในที่เดียว :)
Remotec

1
ควรเป็นวิกิชุมชนในตอนนี้
leppie

คำตอบ:


74

ก่อนอื่นคุณต้องเข้าใจความแตกต่างระหว่าง DLL สองประเภทที่แตกต่างกันมาก Microsoft ตัดสินใจที่จะใช้นามสกุลไฟล์เดียวกัน (.exe และ. dll) กับทั้ง. NET (รหัสที่มีการจัดการ) และโค้ดเนทีฟอย่างไรก็ตาม DLL ของโค้ดที่มีการจัดการและ DLL ดั้งเดิมนั้นแตกต่างกันมาก

1) web.dll เชื่อมโยงกับ business.dll แบบไดนามิกที่จุดใด คุณสังเกตเห็นจำนวนมากใน Windows HDD thrashing สำหรับงานที่ดูเหมือนเล็ก ๆ น้อย ๆ เมื่อใช้ Word และอื่น ๆ และฉันคิดว่า Word นี้จะปิดและเชื่อมโยงในฟังก์ชันการทำงานจาก DLL อื่น ๆ แบบไดนามิกหรือไม่?

1) ในกรณีของ. NET โดยปกติแล้ว DLL จะถูกโหลดตามความต้องการเมื่อมีการเรียกใช้วิธีการแรกที่พยายามเข้าถึงอะไรก็ได้จาก DLL นี่คือเหตุผลที่คุณสามารถรับ TypeNotFoundExceptions ที่ใดก็ได้ในโค้ดของคุณหากไม่สามารถโหลด DLL ได้ เมื่อบางอย่างเช่น Word เริ่มเข้าถึง HDD เป็นจำนวนมากในทันทีอาจมีการแลกเปลี่ยน (รับข้อมูลที่ถูกสลับไปยังดิสก์เพื่อเพิ่มพื้นที่ใน RAM)

1a) นอกจากนี้สิ่งที่โหลดและเชื่อมโยง DLL - O / S หรือเฟรมเวิร์กรันไทม์บางอย่างเช่น. Net framework?

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

1b) กระบวนการ "เชื่อมโยง" คืออะไร? มีการตรวจสอบว่ามีความเข้ากันได้หรือไม่? กำลังโหลดลงในหน่วยความจำเดียวกันหรือไม่? การเชื่อมโยงหมายถึงอะไร?

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

2) อะไรเรียกใช้โค้ดใน DLL ได้จริง? โปรเซสเซอร์ได้รับการดำเนินการหรือมีขั้นตอนอื่นของการแปลหรือการคอมไพล์ก่อนที่โปรเซสเซอร์จะเข้าใจโค้ดภายใน DLL หรือไม่

2) บน Windows ไฟล์. exe และไฟล์. dll นั้นค่อนข้างเหมือนกัน ไฟล์. exe และ. dll แบบเนทีฟมีโค้ดเนทีฟ (ไฟล์เดียวกับที่โปรเซสเซอร์เรียกใช้) ดังนั้นจึงไม่จำเป็นต้องแปล ไฟล์. exe และ. dll ที่ได้รับการจัดการมี. NET bytecode ซึ่งคอมไพล์ JIT แรก (แปลเป็นโค้ดเนทีฟ)

2a) ในกรณีของ DLL ที่สร้างจาก C # .net สิ่งนี้กำลังเรียกใช้สิ่งนี้? . Net framework หรือระบบปฏิบัติการโดยตรง?

2a) หลังจากคอมไพล์โค้ด JIT แล้วโค้ดจะทำงานในลักษณะเดียวกับโค้ดใด ๆ

3) DLL จาก say Linux ทำงานบนระบบ Windows (หากมีสิ่งนั้นอยู่) หรือเป็นระบบปฏิบัติการเฉพาะหรือไม่?

3) DLL ที่มีการจัดการอาจทำงานได้ตามที่เป็นอยู่ตราบเท่าที่เฟรมเวิร์กบนทั้งสองแพลตฟอร์มเป็นปัจจุบันและใครก็ตามที่เขียน DLL ไม่ได้จงใจทำลายความเข้ากันได้โดยใช้การโทรแบบเนทีฟ Native DLLs จะไม่ทำงานในรูปแบบเดียวกันเนื่องจากรูปแบบจะแตกต่างกัน (แม้ว่ารหัสเครื่องภายในจะเหมือนกัน แต่ทั้งสองอย่างสำหรับแพลตฟอร์มโปรเซสเซอร์เดียวกัน) อย่างไรก็ตามบน Linux "DLLs" เรียกว่าไฟล์. so (วัตถุที่ใช้ร่วมกัน)

4) มีความเฉพาะเจาะจงกับกรอบงานเฉพาะหรือไม่? DLL ที่สร้างโดยใช้ C # .Net สามารถใช้โดย DLL ที่สร้างด้วย Borland C ++ (ตัวอย่างเท่านั้น) ได้หรือไม่

4) DLL ที่มีการจัดการนั้นมีไว้สำหรับเฟรมเวิร์ก. NET แต่โดยปกติแล้วมันจะทำงานกับภาษาที่เข้ากันได้ Native DLL เข้ากันได้ตราบใดที่ทุกคนใช้แบบแผนเดียวกัน (การเรียกใช้ข้อตกลง (วิธีการส่งผ่านอาร์กิวเมนต์ของฟังก์ชันในระดับรหัสเครื่อง) การตั้งชื่อสัญลักษณ์ ฯลฯ )

5) กลับไปที่ตัวอย่าง web.dll / business.dll เพื่อให้ได้ประเภทของลูกค้าฉันต้องอ้างอิง business.dll จาก web.dll นั่นต้องหมายความว่า business.dll มีคุณสมบัติบางอย่างของคลาสลูกค้าที่แท้จริง ถ้าฉันรวบรวมไฟล์ business.dll ของฉันโดยบอกว่า Delphi จะ C # เข้าใจและสามารถสร้างคลาสลูกค้าได้ - หรือมีข้อมูลส่วนหัวบางประเภทหรือบางอย่างที่ระบุว่า "เดี๋ยวก่อนขอโทษคุณสามารถใช้ฉันจาก delphi dll อื่นเท่านั้น" .

5) DLL ที่มีการจัดการประกอบด้วยคำอธิบายแบบเต็มของทุกคลาสวิธีการฟิลด์และอื่น ๆ ที่มีอยู่ AFAIK Delphi ไม่รองรับ. NET ดังนั้นมันจะสร้าง DLL ดั้งเดิมซึ่งไม่สามารถใช้ใน. NET ได้โดยตรง คุณอาจจะสามารถเรียกใช้ฟังก์ชันด้วย PInvoke ได้ แต่จะไม่พบคำจำกัดความของคลาส ฉันไม่ได้ใช้ Delphi ดังนั้นฉันจึงไม่รู้ว่ามันเก็บข้อมูลประเภทด้วย DLL ได้อย่างไร ตัวอย่างเช่น C ++ อาศัยไฟล์ส่วนหัว (.h) ซึ่งมีการประกาศประเภทและต้องแจกจ่ายด้วย DLL

6) ในเรื่องของการไฮแจ็ค DLL แน่นอนว่า DLL ทดแทน (ไม่ดี) ต้องมีลายเซ็นของวิธีการที่แน่นอนประเภทที่ถูกแย่งชิง ฉันคิดว่านี่คงไม่ใช่เรื่องยากที่จะทำหากคุณสามารถหาวิธีการอื่น ๆ ที่มีอยู่ใน DLL ดั้งเดิม

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

6a) คำถามซ้ำ ๆ ที่นี่ แต่กลับไปที่สิ่งที่ในโปรแกรม C # ของฉันกำลังตัดสินใจว่าฉันสามารถเข้าถึง DLL อื่นได้หรือไม่? หาก DLL ที่ถูกแย่งชิงของฉันมีเมธอดและประเภทเดียวกันกับต้นฉบับทุกประการ แต่ถูกรวบรวมใน lanugage อื่นจะใช้งานได้หรือไม่

6a) มันจะใช้งานได้ตราบเท่าที่เป็น DLL ที่มีการจัดการซึ่งสร้างด้วยภาษา. NET

  • การนำเข้า DLL คืออะไร? และการลงทะเบียน dll?

"การนำเข้า DLL" อาจหมายถึงหลาย ๆ อย่างโดยทั่วไปหมายถึงการอ้างอิงไฟล์ DLL และใช้สิ่งต่างๆในไฟล์

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


3
ฉันจะเพิ่มใน # 4 ว่า. NET สามารถแปล DLL เพื่อให้เข้ากันได้กับโปรแกรมเนทีฟใด ๆ ที่เข้าใจ / ใช้ COM (Common Object Model) คำตอบที่ดีมาก
MerickOWA

7

ไฟล์. dll มีโค้ดที่คอมไพล์แล้วซึ่งคุณสามารถใช้ในแอปพลิเคชันของคุณ

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

การเชื่อมโยงเกิดขึ้นที่รันไทม์ซึ่งแตกต่างจากไลบรารีที่ลิงก์แบบคงที่เช่นคลาสของคุณซึ่งลิงก์ในเวลาคอมไพล์

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

HTH


6

1) web.dll เชื่อมโยงกับ business.dll แบบไดนามิกที่จุดใด คุณสังเกตเห็นจำนวนมากใน Windows HDD thrashing สำหรับงานที่ดูเหมือนเล็ก ๆ น้อย ๆ เมื่อใช้ Word และอื่น ๆ และฉันคิดว่า Word นี้จะปิดและเชื่อมโยงในฟังก์ชันการทำงานจาก DLL อื่น ๆ แบบไดนามิกหรือไม่?

1) ฉันคิดว่าคุณกำลังสับสนในการเชื่อมโยงกับการโหลด ลิงก์นี้คือเมื่อมีการทดสอบการตรวจสอบและยอดคงเหลือทั้งหมดเพื่อให้แน่ใจว่าสิ่งที่ขอนั้นพร้อมใช้งาน ในขณะโหลดบางส่วนของ dll จะถูกโหลดลงในหน่วยความจำหรือสลับไปที่ pagefile นี่คือกิจกรรม HD ที่คุณเห็น

การลิงก์แบบไดนามิกแตกต่างจากการลิงก์แบบสแตติกตรงที่ในการลิงก์แบบสแตติกรหัสออบเจ็กต์ทั้งหมดจะถูกใส่ลงใน. exe หลักในเวลาลิงก์ ด้วยการเชื่อมโยงแบบไดนามิกรหัสออบเจ็กต์จะถูกใส่ลงในไฟล์แยกต่างหาก (dll) และโหลดในเวลาที่แตกต่างจาก. exe

การเชื่อมโยงแบบไดนามิกอาจเป็นนัย (เช่นการเชื่อมโยงแอปกับ lib นำเข้า) หรือชัดเจน (เช่นแอปใช้ LoadLibrary (เช่น) เพื่อโหลด dll)

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

COM ใช้ LoadLibrary เพื่อโหลด COM dll โปรดทราบว่าแม้ในกรณีโดยนัยระบบกำลังใช้สิ่งที่คล้ายกับ LoadLibrary เพื่อโหลด dll ในขณะเริ่มต้นกระบวนการหรือเมื่อใช้งานครั้งแรก

2) อะไรเรียกใช้โค้ดใน DLL ได้จริง? โปรเซสเซอร์ได้รับการดำเนินการหรือมีขั้นตอนอื่นของการแปลหรือการคอมไพล์ก่อนที่โปรเซสเซอร์จะเข้าใจโค้ดภายใน DLL หรือไม่

2) Dlls มีรหัสวัตถุเช่นเดียวกับ. exes รูปแบบของไฟล์ dll นั้นแทบจะเหมือนกับรูปแบบของไฟล์ exe ฉันได้ยินมาว่ามีเพียงบิตเดียวที่แตกต่างกันในส่วนหัวของทั้งสองไฟล์

ในกรณีของ DLL ที่สร้างจาก C # .net เฟรมเวิร์ก. Net กำลังเรียกใช้

3) DLL จาก say Linux ทำงานบนระบบ Windows (หากมีสิ่งนั้นอยู่) หรือเป็นระบบปฏิบัติการเฉพาะหรือไม่?

3) DLL เป็นแพลตฟอร์มเฉพาะ

4) มีความเฉพาะเจาะจงกับกรอบงานเฉพาะหรือไม่? DLL ที่สร้างโดยใช้ C # .Net สามารถใช้โดย DLL ที่สร้างด้วย Borland C ++ (ตัวอย่างเท่านั้น) ได้หรือไม่

4) DLL สามารถทำงานร่วมกับเฟรมเวิร์กอื่น ๆ ได้หากใช้ความระมัดระวังเป็นพิเศษหรือมีการเขียนโค้ดกาวเพิ่มเติม

DLL มีประโยชน์มากเมื่อ บริษัท ขายผลิตภัณฑ์หลายรายการที่มีความสามารถทับซ้อนกัน ตัวอย่างเช่นฉันดูแลรักษา raster i / o dll ที่ใช้โดยผลิตภัณฑ์ต่างๆมากกว่า 30 รายการที่ บริษัท หากคุณติดตั้งผลิตภัณฑ์หลายรายการการอัปเกรด dll หนึ่งรายการสามารถอัปเกรดผลิตภัณฑ์ทั้งหมดเป็นรูปแบบแรสเตอร์ใหม่ได้

5) กลับไปที่ตัวอย่าง web.dll / business.dll เพื่อให้ได้ประเภทของลูกค้าฉันต้องอ้างอิง business.dll จาก web.dll นั่นต้องหมายความว่า business.dll มีคุณสมบัติบางอย่างของคลาสลูกค้าที่แท้จริง ถ้าฉันรวบรวมไฟล์ business.dll ของฉันโดยบอกว่า Delphi จะ C # เข้าใจและสามารถสร้างคลาสลูกค้าได้ - หรือมีข้อมูลส่วนหัวบางประเภทหรือบางอย่างที่ระบุว่า "เดี๋ยวก่อนขอโทษคุณสามารถใช้ฉันจาก delphi dll อื่นเท่านั้น" .

5) ขึ้นอยู่กับแพลตฟอร์มความสามารถของ dll จะถูกนำเสนอในรูปแบบต่างๆผ่านไฟล์. h ไฟล์. tlb หรือวิธีอื่น ๆ บน. net

6) ในเรื่องของการไฮแจ็ค DLL แน่นอนว่า DLL ทดแทน (ไม่ดี) ต้องมีลายเซ็นของวิธีการที่แน่นอนประเภทที่ถูกแย่งชิง ฉันคิดว่านี่คงไม่ใช่เรื่องยากที่จะทำหากคุณสามารถหาวิธีการอื่น ๆ ที่มีอยู่ใน DLL ดั้งเดิม

6) dumpbin / export และ dumbin / imports เป็นเครื่องมือที่น่าสนใจสำหรับใช้กับ. exe และ. dlls


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