. dll กำลังทำอะไรในโปรแกรม Linux


20

เกมที่ถูกสร้างขึ้นมาด้วย Unity3D สำหรับลินุกซ์มีไฟล์ในโฟลเดอร์ข้อมูลของพวกเขา.dllGameDataFolder/Managed

ซึ่งแปลกเพราะฉันคิดว่า Linux ใช้.soไฟล์แทน.dllไฟล์

(เช่นเดียวกันสำหรับแอพ Android-Unity3D ด้วย)

ทำไม?

คำตอบ:


25

เกมที่คุณพูดถึงนั้นขึ้นอยู่กับ. NET Framework และทำงานกับโมโนซึ่งเป็นการนำมาใช้ฟรีและโอเพ่นซอร์สของ. NET Framework ของ Microsoft

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

โปรแกรม. NET หนึ่งโปรแกรมที่ออกแบบมาสำหรับการใช้งานข้ามแพลตฟอร์มสามารถเรียกใช้บน Windows, Linux หรือ Mac ด้วย "ไบนารี" เดียวกัน (รวมถึง DLLs ซึ่งเป็นแอสเซมบลี) ซึ่งคอมไพล์ใน MSIL และต้องการรันไทม์. NET / Mono .

โปรดทราบว่าคุณยังมีแอพพลิเคชั่นฟรี (ไม่เพียง แต่เกม) ที่อ้างอิงจาก Mono Framework ที่มีอยู่ในที่เก็บ Ubuntu ตัวอย่างเช่น: ทอมบอย


11
นอกจากนี้โปรดทราบว่า dll เหล่านั้นไม่ใช่ "ของจริง" ของ windows dll แต่รวบรวมโดย bytecode. NET จริง ๆ
Sanya_Zol

5
โปรดทราบด้วยว่านามสกุลไฟล์รวมถึง.dllและ.soไม่มีความหมายใน Linux พวกมันใช้เพื่อความสะดวกของเราเท่านั้น
code_dredd

1
@ray คุณอธิบายได้มั้ย ฉันคิดว่าพวกเขายังคงเป็นมาตรฐานในการถ่ายทอดข้อมูลประเภทไฟล์ดังนั้นจึงไม่มีความหมาย?
FMaz

2
@FynnMazurkiewicz: มันเป็นเรื่องของประเพณีการออกแบบที่แตกต่างกันเล็กน้อยกว่าแอตทริบิวต์กลางเดียวที่ทั้งสองระบบบังคับใช้ ในความเป็นจริงทั้งเคอร์เนลของ Windows และตัวเชื่อมโยงแบบไดนามิกของ Linux จะโหลดไลบรารีที่ใช้ร่วมกันอย่างมีความสุข (ในรูปแบบที่เกี่ยวข้อง) ไม่ว่าชื่อไฟล์นั้นจะลงท้ายด้วย. dll หรือ. so หรืออย่างอื่น ด้วยเหตุผลทางประวัติศาสตร์ syscall LoadLibrary ใน Windows จะในบางกรณีผนวก ".dll" ชื่อไฟล์ถ้ามันไม่ได้มีส่วนขยายแล้ว แต่นั่นไม่ใช่วิธีการที่มันมักจะใช้
Henning Makholm

1
@ray ไม่มาก: gccจะไม่พบห้องสมุดที่ให้มาเช่น-lmถ้าชื่อไฟล์นั้นไม่ได้ลงท้ายด้วย.soหรือ.aหรือมีรุ่นที่ต่างกันไป
Ruslan

9

.dllไฟล์ในGameDataFolder/Managedเป็นของโปรแกรมรหัสพื้นเมืองที่ใช้โมโนภายใน

เอ็นจิ้นเกม Unity ฝัง Mono (แม้แต่บนแพลตฟอร์ม Windows ส่วนใหญ่)

executables ข้ามแพลตฟอร์มและไลบรารีที่แบ่งใช้ซึ่งสามารถรันได้โดย. NET Common Language Runtime หรือ Mono มักจะตั้งชื่อด้วย.exeและ.dllต่อท้ายตามลำดับแม้ว่าจะไม่เฉพาะกับ Windows ก็ตาม เมื่อคุณพบ.dllไฟล์ในโปรแกรมสำหรับระบบ GNU / Linux เช่นอูบุนตูหรือสำหรับระบบปฏิบัติการใด ๆ แต่ของ Windows นี้เป็นมักจะทำไม เวลาส่วนใหญ่ที่คุณพบ.dllในระบบ Ubuntu คำตอบของ Golbothอธิบายไว้ แต่นั่นไม่ใช่สิ่งที่เกิดขึ้นที่นี่

เอ็นจิ้นเกม Unity - ซึ่งไม่ควรสับสนกับอินเทอร์เฟซแบบกราฟิกเริ่มต้นใน Ubuntu ส่วนใหญ่ - เป็นเอ็นจิ้นเกมข้ามแพลตฟอร์มที่ได้รับความนิยม เอ็นจินนี้ไม่ทำงานบน. NET Framework หรือ Mono แต่มันฝังโมโนซึ่งก็คือการบอกว่าโมโนวิ่งด้านบนของมัน นี่คือวิธีที่นักพัฒนาเขียนโค้ดอะไรก็ตามที่เกมของพวกเขาต้องการซึ่งไม่ได้เป็นส่วนหนึ่งของเอ็นจิ้น Unity

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

เอ็นจิ้นของ Unity Game Engine ใช้โมโน

เอ็นจิ้นเกม Unity ซึ่งส่วนใหญ่เขียนใน C ++ จะโฮสต์อินสแตนซ์ของตนเองของ Mono ซึ่งไม่ได้ใช้ - และอาจแตกต่างจาก - เวอร์ชั่น (ถ้ามี) ติดตั้งผ่านตัวจัดการแพคเกจระบบของคุณ ไม่สามารถใช้รันไทม์ Mono แบบฝังนี้เพื่อเรียกใช้โปรแกรม. NET / Mono แบบสแตนด์อโลนเนื่องจากไม่ได้มีวัตถุประสงค์ แต่ส่วนรหัสเนทีฟของเอ็นจิ้นใช้เพื่อรันโค้ด CIL แทน (CIL คือCommon Intermediate Languageซึ่งเป็นชื่อทางการของมันก่อนหน้านี้เรียกว่า MSIL หรือ Microsoft Intermediate Language เนื่องจาก Microsoft พัฒนาขึ้น แต่เดิม) โปรแกรมเมอร์ที่สร้างเกมที่ใช้ Unity engine มักจะเขียนโค้ดของตัวเองในภาษา C # แม้ว่าภาษาอื่น ๆ ได้รับการสนับสนุน

เอ็นจิ้น Unity ฝัง Mono แม้แต่ใน Windows สำหรับเกมUniversal Windows Platform - และไม่มีแพลตฟอร์มอื่น - ใช้ Microsoft .NET Framework แทน Mono แต่เกม Unity ส่วนใหญ่บนแพลตฟอร์มส่วนใหญ่รวมถึงอุปกรณ์พกพาและคอนโซลเกมส่วนใหญ่รวมถึง Ubuntu และ Windows ใช้ Mono ในบางแพลตฟอร์มIL2CPPนั้นมีให้เลือกใช้แทน Mono และรองรับ IL2CPP เพียงไม่กี่ตัวเท่านั้น ดูข้อ จำกัด การเขียนสคริปต์สำหรับรายละเอียด

สถานการณ์อื่น ๆ ที่คุณอาจเห็น.dllไฟล์บน Ubuntu

.dllมีการอธิบายสองสถานการณ์ที่คุณน่าจะเห็นไฟล์บน Ubuntu:

  1. ไลบรารีแบบแบ่งใช้ที่มีวัตถุประสงค์เพื่อใช้โดยแอ็พพลิเคชัน. NET / Mono คำตอบของ Golbothอธิบายรายละเอียดนี้ นี่คือสิ่งที่.dllคุณเห็นมากที่สุดในระบบ Ubuntu มันไม่ได้เกิดขึ้นกับ.dllไฟล์ในGameDataFolder/Managedโฟลเดอร์ของคุณ
  2. ไฟล์ที่ให้รหัสซึ่งใช้โดยรันไทม์ Mono แบบฝังเพื่อจัดทำ "สคริปต์" สำหรับแอปพลิเคชันรหัสเนทีฟ นั่นคือสิ่งที่เกิดขึ้นในกรณีนี้

มีอีกสองกรณีที่พบบ่อยพอสมควรซึ่งคุณอาจเห็น.dllไฟล์บน Ubuntu:

  1. คอมไพเลอร์สำหรับ. NET Coreสร้าง.dllไฟล์มากกว่า.exeไฟล์แม้ว่าสิ่งที่คุณกำลังรวบรวมไม่ใช่ห้องสมุด รันไทม์. NET Core (เรียกว่า CoreCLR) และไม่ใช่ . NET Framework ปกติหรือโมโนเรียกใช้ไฟล์เหล่านี้ .NET Core เป็นผลิตภัณฑ์ของ Microsoft แต่แตกต่างจาก. NET Framework มาตรฐาน. NET Core เป็นข้ามแพลตฟอร์มพร้อมการสนับสนุนอย่างเป็นทางการสำหรับระบบ GNU / Linux เช่น Ubuntu และเป็นซอฟต์แวร์โอเพ่นซอร์สฟรี
  2. บางครั้ง.dllไฟล์ที่คุณเห็นบน Ubuntu จะเป็นห้องสมุด Windows คุณอาจเห็นสิ่งนี้หากโปรแกรมกำลังจัดเก็บระบบ Ubuntu แต่ทำงานบน Windows หรือถ้าคุณติดตั้งไดรฟ์ Windows ใน Ubuntu คุณอาจเห็นว่าเกี่ยวข้องกับโปรแกรมที่สามารถเรียกใช้บน Ubuntu โดยใช้Wineรวมถึงซอฟต์แวร์ที่มาพร้อมกับ Wine หรือติดตั้งโดยอัตโนมัติด้วยwinetricksเพื่อสนับสนุนซอฟต์แวร์ Windows อื่น ๆ

นี่ไม่ใช่ความพยายามในการแสดงรายการสถานการณ์ทั้งหมดที่คุณอาจพบ.dllบน Ubuntu (ตัวอย่างเช่นอาจเป็นไลบรารี OS / 2 ) อย่างไรก็ตามฉันเชื่อว่าทั้งสี่กรณีเป็นกรณีที่พบบ่อยที่สุด

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