ฉันต้องการทราบความแตกต่างที่แน่นอนระหว่างไฟล์ dll และ exe
ฉันต้องการทราบความแตกต่างที่แน่นอนระหว่างไฟล์ dll และ exe
คำตอบ:
EXE:
DLL:
สำหรับรายละเอียดเพิ่มเติม: http://www.c-sharpcorner.com/Interviews/Answer/Answers.aspxQuestionId=1431&MajorCategoryId=1&MinorCategoryId=1 http://wiki.answers.com/Q/What_is_the_difference_between_an_EXE_and_a_DLL
อ้างอิง: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx
LibMain
ฟังก์ชัน
ฉันไม่รู้ว่าทำไมทุกคนถึงตอบคำถามนี้ในบริบทของ. NET คำถามเป็นคำถามทั่วไปและไม่ได้กล่าวถึง. NET ที่ใดเลย
ความแตกต่างที่สำคัญคือ:
EXE
DLL
รูปแบบไฟล์ของ DLL และ exe นั้นเหมือนกัน Windows รับรู้ความแตกต่างระหว่าง DLL และ EXE ผ่าน PE Header ในไฟล์ สำหรับรายละเอียดของ PE Header คุณสามารถดูบทความนี้ใน MSDN
ความแตกต่างก็คือ EXE มีจุดเริ่มต้นซึ่งเป็นวิธีการ "หลัก" ที่จะทำงานเมื่อดำเนินการ
ต้องเรียกรหัสภายใน DLL จากแอปพลิเคชันอื่น
ยังมีความแตกต่างอีกเล็กน้อยเกี่ยวกับโครงสร้างที่คุณสามารถพูดถึงได้
Characteristics
สมาชิกของภายในIMAGE_FILE_HEADER
IMAGE_NT_HEADERS
สำหรับ DLL จะมีการIMAGE_FILE_DLL
เปิดแฟล็ก (0x2000) สำหรับ EXE เป็นIMAGE_FILE_EXECUTABLE_IMAGE
แฟล็ก (0x2)IMAGE_OPTIONAL_HEADER
) คือImageBase
สมาชิก ระบุแอดเดรสเสมือนที่ PE ถือว่าจะถูกโหลด หากโหลดด้วยที่อยู่อื่นพอยน์เตอร์บางตัวอาจชี้ไปที่หน่วยความจำผิด เนื่องจากไฟล์ EXE เป็นหนึ่งในไฟล์แรกที่โหลดลงในพื้นที่แอดเดรสใหม่ตัวโหลด Windows สามารถรับรองที่อยู่โหลดคงที่และโดยปกติจะเป็น 0x00400000 ความหรูหรานั้นไม่มีอยู่สำหรับ DLL ไฟล์ DLL สองไฟล์ที่โหลดในกระบวนการเดียวกันสามารถขอที่อยู่เดียวกันได้ นี่คือเหตุผลที่ DLL ที่มีไดเรกทอรีข้อมูลอื่นที่เรียกว่าฐานย้าย Directory ที่มักจะอาศัยอยู่ในส่วนของตัวเอง .reloc
- ไดเร็กทอรีนี้มีรายชื่อของสถานที่ใน DLL ที่ต้องทำการ rebased / patched เพื่อให้ชี้ไปที่หน่วยความจำที่ถูกต้อง ไฟล์ EXE ส่วนใหญ่ไม่มีไดเร็กทอรีนี้ แต่คอมไพเลอร์เก่าบางตัวสร้างขึ้นคำตอบนี้ละเอียดกว่าที่คิดเล็กน้อย แต่อ่านผ่าน ๆ
DLL:
ในกรณีส่วนใหญ่ไฟล์ DLL เป็นห้องสมุด มีสองประเภทของห้องสมุดเป็นแบบไดนามิกและแบบคงที่ - อ่านเกี่ยวกับความแตกต่าง DLL ย่อมาจากdynamic link libraryซึ่งบอกเราว่าเป็นส่วนหนึ่งของโปรแกรม แต่ไม่ใช่ทั้งหมด มันทำจากส่วนประกอบซอฟต์แวร์นำมาใช้ใหม่ ( ห้องสมุด ) ที่คุณสามารถใช้สำหรับการมากกว่าโปรแกรมเดียว โปรดทราบว่าเป็นไปได้เสมอที่จะใช้ซอร์สโค้ดของไลบรารีในหลาย ๆ แอปพลิเคชันโดยใช้การคัดลอกวาง แต่แนวคิดของ DLL / Static Library คือคุณสามารถอัปเดตรหัสของไลบรารีและในเวลาเดียวกันจะอัปเดตแอปพลิเคชันทั้งหมดโดยใช้ มัน - โดยไม่ต้องรวบรวม
ตัวอย่างเช่น
ลองนึกภาพคุณกำลังสร้างคอมโพเนนต์ของ Windows GUIเช่นปุ่ม ในกรณีส่วนใหญ่คุณต้องการใช้โค้ดที่คุณเขียนซ้ำเนื่องจากเป็นรหัสที่ซับซ้อน แต่เป็นส่วนประกอบทั่วไปคุณต้องการให้แอปพลิเคชันจำนวนมากใช้งานได้ แต่คุณไม่ต้องการให้รหัสที่มาคุณไม่สามารถคัดลอกได้ -paste รหัสสำหรับปุ่มในทุกโปรแกรมเพื่อให้คุณตัดสินใจว่าคุณต้องการที่จะสร้างDL-Library (DLL)
นี้"ปุ่ม"ห้องสมุดถูกต้องตามEXE cutables ในการทำงานและไม่ได้ที่พวกเขาจะไม่ทำงานเพราะพวกเขาไม่ทราบวิธีการสร้างปุ่มเพียงวิธีการพูดคุยกับมัน
ในทำนองเดียวกัน DLL ที่ไม่สามารถดำเนินการ - วิ่งเพราะมันเป็นเพียงส่วนหนึ่งของโปรแกรม แต่ไม่ได้มีข้อมูลที่จำเป็นในการสร้าง"ขั้นตอน"
EXE:
ปฏิบัติการเป็นโปรแกรม มันรู้วิธีสร้างกระบวนการและวิธีพูดคุยกับ DLL มันต้องการ DLL เพื่อสร้างปุ่มและโดยไม่ได้ใบสมัครไม่ได้รัน - ข้อผิดพลาด
หวังว่านี่จะช่วยได้ ....
using SomeClassFromALibrary
ไลบรารีนั้นจะเชื่อมโยงกับโปรเจ็กต์ผ่าน DLL? แค่พยายามดูว่าฉันเข้าใจถูกต้องหรือไม่
using
สำหรับเนมสเปซไม่ใช่คลาส มีข้อยกเว้นสำหรับusing static
c # 6 ซึ่งนำเข้าสมาชิกแบบคงที่ทั้งหมดที่มีอยู่ในคลาสที่ระบุ ( ลิงก์ ) using
คำหลักให้สัญญาว่าจะคอมไพเลอร์ที่ที่รันไทม์จะมีห้องสมุดที่มีที่namespace ไลบรารีไม่ได้เชื่อมโยงกับโปรเจ็กต์ผ่าน DLL นั้น DLL คือไลบรารีที่เชื่อมโยงกับโปรเจ็กต์ (แอสเซมบลี) DLL นั้นมีรหัสทั้งหมดที่สัญญาไว้ในเวลาคอมไพล์
ทั้ง DLL และ EXE เป็นรูปแบบ Portable Executable (PE)
เชื่อมโยง dynamic library (DLL)เป็นห้องสมุดและดังนั้นจึงไม่สามารถดำเนินการได้โดยตรง หากคุณพยายามเรียกใช้คุณจะได้รับข้อผิดพลาดเกี่ยวกับจุดเข้าที่หายไป จำเป็นต้องมีจุดเริ่มต้น (ฟังก์ชันหลัก) เพื่อดำเนินการจุดเข้านั้นอาจเป็นแอปพลิเคชันหรือ exe ใดก็ได้ การรวม DLL เกิดขึ้นในขณะทำงาน นั่นคือเหตุผลที่เรียกว่าไลบรารี "Dynamic Link"
ปฏิบัติการ (EXE)เป็นโปรแกรมที่สามารถดำเนินการ มันมีจุดเข้าของตัวเอง แฟล็กภายในส่วนหัว PE ระบุว่าเป็นไฟล์ประเภทใด (ไม่เกี่ยวข้องกับนามสกุลไฟล์) ส่วนหัว PE มีฟิลด์ที่มีจุดเริ่มต้นสำหรับโปรแกรมอยู่ ใน DLL ไม่ได้ใช้ (หรืออย่างน้อยก็ไม่ใช้เป็นจุดเริ่มต้น)
มีซอฟต์แวร์มากมายสำหรับตรวจสอบข้อมูลส่วนหัว ข้อแตกต่างเพียงอย่างเดียวที่ทำให้ทั้งสองทำงานแตกต่างกันคือบิตในส่วนหัวดังแสดงในแผนภาพด้านล่าง
ไฟล์ EXE มีรายการหลักเพียงรายการเดียวหมายความว่าเป็นแอปพลิเคชันที่แยกต่างหากเมื่อระบบเปิดตัว exe กระบวนการใหม่จะถูกสร้างขึ้นในขณะที่ DLL มีจุดเข้าใช้งานจำนวนมากดังนั้นเมื่อแอปพลิเคชันใช้งานจะไม่มีกระบวนการใหม่เริ่มต้น DLL สามารถใช้ซ้ำและกำหนดเวอร์ชันได้ DLL ลดพื้นที่จัดเก็บเนื่องจากโปรแกรมต่างๆสามารถใช้ dll เดียวกันได้
.exe
หรือ.dll
ไม่สำคัญ? มันเป็นแฟล็กในส่วนหัวที่แยกความแตกต่างอย่างแท้จริง .... ดังนั้นถ้าฉันสร้างexe
และตั้งชื่อผ่านการโต้ตอบ GUI เป็น a .dll
แต่เปลี่ยนแฟล็กนั้นด้วยตนเองก็ยังรันได้?
exe dll v / s
1) ไฟล์ DLL เป็นไลบรารีลิงค์แบบไดนามิกซึ่งสามารถใช้ในไฟล์ exe และไฟล์ dll อื่น ๆ
ไฟล์ EXE เป็นไฟล์ปฏิบัติการซึ่งทำงานในกระบวนการแยกต่างหากซึ่งจัดการโดย OS
2) DLL ไม่สามารถใช้งานได้โดยตรง ไฟล์เหล่านี้เป็นไฟล์แยกต่างหากที่มีฟังก์ชันที่สามารถเรียกใช้โดยโปรแกรมและ DLL อื่น ๆ เพื่อทำการคำนวณและฟังก์ชันต่างๆ
EXE คือโปรแกรมที่สามารถเรียกใช้งานได้ เช่นโปรแกรม Windows
3) Reusability
DLL: สามารถนำกลับมาใช้กับแอปพลิเคชันอื่น ๆ ได้ ตราบใดที่ผู้เขียนโค้ดรู้จักชื่อและพารามิเตอร์ของฟังก์ชันและโพรซีเดอร์ในไฟล์ DLL
EXE: สำหรับวัตถุประสงค์เฉพาะเท่านั้น
4) DLL จะแชร์กระบวนการและพื้นที่หน่วยความจำเดียวกันของแอปพลิเคชันการโทรในขณะที่
EXE สร้างกระบวนการและพื้นที่หน่วยความจำแยกกัน
5) ใช้
DLL: คุณต้องการให้แอปพลิเคชั่นจำนวนมากใช้งานได้ แต่คุณไม่ต้องการให้ซอร์สโค้ดแก่พวกเขาคุณไม่สามารถคัดลอกวางโค้ดสำหรับปุ่มในทุกโปรแกรมได้ดังนั้นคุณจึงตัดสินใจว่าต้องการสร้าง DL- ไลบรารี (DLL)
EXE: เมื่อเราทำงานกับเทมเพลตโครงการเช่น Windows Forms Applications, Console Applications, WPF Applications และ Windows Services พวกเขาจะสร้างแอสเซมบลี exe เมื่อคอมไพล์
6) ความคล้ายคลึงกัน:
ทั้ง DLL และ EXE เป็นไฟล์ไบนารีที่มีโครงสร้างซ้อนกันที่ซับซ้อนซึ่งกำหนดโดยรูปแบบ Portable Executable และไม่ได้ตั้งใจให้ผู้ใช้สามารถแก้ไขได้
สองสิ่ง: ส่วนขยายและแฟล็กส่วนหัวที่เก็บไว้ในไฟล์
ทั้งสองไฟล์เป็นไฟล์ PE ทั้งสองแบบมีเค้าโครงเดียวกัน DLL เป็นไลบรารีดังนั้นจึงไม่สามารถเรียกใช้งานได้ หากคุณพยายามเรียกใช้คุณจะได้รับข้อผิดพลาดเกี่ยวกับจุดเข้าที่หายไป EXE คือโปรแกรมที่สามารถเรียกใช้งานได้ มันมีจุดเข้า แฟล็กภายในส่วนหัว PE ระบุว่าเป็นไฟล์ประเภทใด (ไม่เกี่ยวข้องกับนามสกุลไฟล์) ส่วนหัว PE มีฟิลด์ที่มีจุดเริ่มต้นสำหรับโปรแกรมอยู่ ใน DLL ไม่ได้ใช้ (หรืออย่างน้อยก็ไม่ใช้เป็นจุดเริ่มต้น)
ข้อแตกต่างเล็กน้อยประการหนึ่งคือในกรณีส่วนใหญ่DLLจะมีส่วนการส่งออกที่มีการส่งออกสัญลักษณ์ EXE ไม่ควรมีส่วนส่งออกเนื่องจากไม่ใช่ไลบรารี แต่ไม่มีอะไรป้องกันไม่ให้เกิดขึ้น ตัวโหลด Win32 ไม่สนใจทางใดทางหนึ่ง
นอกเหนือจากนั้นจะเหมือนกัน ดังนั้นโดยสรุปแล้ว EXE เป็นโปรแกรมที่เรียกใช้งานได้ในขณะที่ DLLs เป็นไลบรารีที่โหลดเข้าสู่กระบวนการและมีฟังก์ชันการทำงานที่เป็นประโยชน์เช่นความปลอดภัยการเข้าถึงฐานข้อมูลหรือบางอย่าง
. exe คือโปรแกรม .dll เป็นไลบรารีที่. exe (หรือ. dll อื่น) อาจเรียกเข้าไป
สิ่งที่ sakthivignesh พูดอาจเป็นจริงใน. exe ตัวนั้นสามารถใช้อันอื่นได้ราวกับว่ามันเป็นไลบรารีและสิ่งนี้จะเสร็จสิ้น (ตัวอย่าง) กับคอมโพเนนต์ COM บางตัว ในกรณีนี้ "slave" .exe เป็นโปรแกรมแยกต่างหาก (พูดอย่างเคร่งครัดคือกระบวนการแยกกัน - อาจทำงานบนเครื่องแยกต่างหาก) แต่โปรแกรมที่ยอมรับและจัดการคำขอจากโปรแกรม / ส่วนประกอบอื่น ๆ
อย่างไรก็ตามหากคุณเลือก. exe และ. dll แบบสุ่มจากโฟลเดอร์ในไฟล์โปรแกรมของคุณโอกาสที่ COM ไม่เกี่ยวข้อง - เป็นเพียงโปรแกรมและไลบรารีที่เชื่อมโยงแบบไดนามิก
การใช้ Win32 APIs โปรแกรมสามารถโหลดและใช้ DLL โดยใช้ฟังก์ชัน LoadLibrary และ GetProcAddress API IIRC มีฟังก์ชันที่คล้ายกันใน Win16
COM เป็นวิวัฒนาการของแนวคิด DLL ในหลาย ๆ ด้าน แต่เดิมสรุปได้ว่าเป็นพื้นฐานสำหรับ OLE2 ในขณะที่. NET เป็นลูกหลานของ COM DLL มีมาตั้งแต่ Windows 1, IIRC เดิมเป็นวิธีการแบ่งปันรหัสไบนารี (โดยเฉพาะ API ระบบ) ระหว่างโปรแกรมที่ทำงานอยู่หลายโปรแกรมเพื่อลดการใช้หน่วยความจำ
ระบบจะมองเห็น EXE เป็นโปรแกรมปฏิบัติการ Win32 ทั่วไป จุดเริ่มต้นหมายถึงตัวโหลดขนาดเล็กที่เริ่มต้นรันไทม์. NET และบอกให้โหลดและดำเนินการแอสเซมบลีที่มีอยู่ใน EXE ระบบจะมองเห็น DLL เป็น Win32 DLL แต่ส่วนใหญ่จะไม่มีจุดเข้าใช้งาน รันไทม์. NET เก็บข้อมูลเกี่ยวกับแอสเซมบลีที่มีอยู่ในส่วนหัวของตัวเอง
dll คือชุดของฟังก์ชันที่ใช้ซ้ำได้โดยที่. exe เป็นไฟล์ปฏิบัติการซึ่งอาจเรียกใช้ฟังก์ชันเหล่านี้
● .exe และ dll เป็นโค้ด c # เวอร์ชันคอมไพล์ซึ่งเรียกอีกอย่างว่าแอสเซมบลี
● .exe เป็นไฟล์ปฏิบัติการแบบสแตนด์อโลนซึ่งหมายความว่าสามารถเรียกใช้งานได้โดยตรง
● .dll เป็นส่วนประกอบที่ใช้ซ้ำได้ซึ่งไม่สามารถดำเนินการได้โดยตรงและต้องใช้โปรแกรมอื่นในการดำเนินการ
1) DLL คือ In-Process Component ซึ่งหมายถึงการทำงานในพื้นที่หน่วยความจำเดียวกันกับกระบวนการไคลเอ็นต์ EXE เป็นส่วนประกอบนอกกระบวนการซึ่งหมายความว่ามันทำงานในพื้นที่หน่วยความจำแยกต่างหาก
2) DLL มีฟังก์ชันและขั้นตอนที่โปรแกรมอื่นสามารถใช้ได้ (ส่งเสริมความสามารถในการใช้ซ้ำ) ในขณะที่ EXE ไม่สามารถแชร์กับโปรแกรมอื่นได้
3) DLL ไม่สามารถทำงานได้โดยตรงเนื่องจากถูกออกแบบมาให้โหลดและเรียกใช้โดยโปรแกรมอื่น EXE เป็นโปรแกรมที่เรียกใช้งานโดยตรง
สำหรับผู้ที่ต้องการคำตอบที่กระชับ
หากแอสเซมบลีถูกคอมไพล์เป็นไลบรารีคลาสและจัดเตรียมประเภทสำหรับแอสเซมบลีอื่น ๆ ที่จะใช้แสดงว่าแอสเซมบลีนั้นมีนามสกุล ifle .dll
(ไลบรารีลิงก์ไดนามิก) และไม่สามารถดำเนินการแบบสแตนด์อโลนได้
ในทำนองเดียวกันหากแอสเซมบลีถูกคอมไพล์เป็นแอพพลิเคชั่นแสดงว่าแอสเซมบลีนั้นมีนามสกุลไฟล์.exe
(เรียกใช้งานได้) และสามารถดำเนินการแบบสแตนด์อโลนได้ ก่อนหน้า. NET Core 3.0 แอปคอนโซลถูกคอมไพล์เป็น. dll fles และต้องดำเนินการโดยคำสั่ง dotnet run หรือโฮสต์ปฏิบัติการ - ที่มา
ความแตกต่างที่แน่นอนที่สำคัญระหว่าง DLL และ EXE ที่ DLL ไม่มีจุดเริ่มต้นและ EXE ทำ หากคุณคุ้นเคยกับ c ++ คุณจะเห็นว่า build EXE มีฟังก์ชันการป้อน main () และ DLL ไม่มี :)