Apa sebenarnya file DLL, dan bagaimana cara kerjanya?

224

Bagaimana tepatnya file DLL bekerja? Tampaknya ada banyak sekali dari mereka, tetapi saya tidak tahu apa itu atau bagaimana mereka bekerja.

Jadi, apa masalahnya dengan mereka?

stalepretzel
sumber
6
Karena ini hanya ditandai dengan Windows, dan pertanyaan ini ditulis kembali pada tahun 2008, perlu disebutkan bahwa saat ini dll berjalan di Mac dan Linux juga dengan .NET Core.
Jim Aho

Jawaban:

287

Apa itu DLL?

Dynamic Link Libraries (DLL) seperti EXEs tetapi tidak dapat dieksekusi secara langsung. Mereka mirip dengan file .so di Linux / Unix. Dengan kata lain, DLL adalah implementasi MS dari perpustakaan bersama.

DLL sangat mirip EXE sehingga format file itu sendiri sama. Baik EXE dan DLL didasarkan pada format file Portable Executable (PE). DLL juga dapat berisi komponen COM dan pustaka .NET.

Apa yang terkandung dalam DLL?

DLL berisi fungsi, kelas, variabel, UI, dan sumber daya (seperti ikon, gambar, file, ...) yang digunakan oleh EXE, atau DLL lainnya.

Jenis perpustakaan:

Di hampir semua sistem operasi, ada 2 jenis perpustakaan. Perpustakaan statis dan perpustakaan dinamis. Di windows ekstensi file adalah sebagai berikut: Static libraries (.lib) dan dynamic libraries (.dll). Perbedaan utama adalah bahwa perpustakaan statis ditautkan ke executable pada waktu kompilasi; sedangkan pustaka terkait dinamis tidak ditautkan sampai run-time.

Lebih banyak tentang perpustakaan statis dan dinamis:

Anda biasanya tidak melihat perpustakaan statis di komputer Anda, karena perpustakaan statis tertanam langsung di dalam modul (EXE atau DLL). Pustaka dinamis adalah file yang berdiri sendiri.

DLL dapat diubah kapan saja dan hanya dimuat saat runtime ketika EXE secara eksplisit memuat DLL. Pustaka statis tidak dapat diubah setelah dikompilasi dalam EXE. DLL dapat diperbarui secara terpisah tanpa memperbarui EXE itu sendiri.

Memuat DLL:

Suatu program memuat DLL saat startup, melalui Win32 API LoadLibrary, atau ketika itu adalah ketergantungan dari DLL lain. Suatu program menggunakan GetProcAddress untuk memuat suatu fungsi atau LoadResource untuk memuat sumber daya.

Bacaan lebih lanjut:

Silakan periksa MSDN atau Wikipedia untuk bacaan lebih lanjut. Juga sumber jawaban ini.

Brian R. Bondy
sumber
5
Mungkin harus menyebutkan lib impor di suatu tempat. OK aku akan pergi sekarang. :)
Adam Mitz
2
Menghapus orang-orang yang tampaknya ditangani. Bagaimana saya mendapatkan poin untuk ini? <g>
Adam Mitz
36

Apa itu DLL?

File DLL adalah file biner yang dapat berisi kode yang dapat dieksekusi dan sumber daya seperti gambar, dll. Tidak seperti aplikasi, ini tidak dapat langsung dieksekusi, tetapi aplikasi akan memuatnya sesuai dan ketika diperlukan (atau sekaligus selama startup).

Apakah itu penting?

Sebagian besar aplikasi akan memuat file DLL yang mereka butuhkan saat startup. Jika salah satu dari ini tidak ditemukan, sistem tidak akan dapat memulai proses sama sekali.

File DLL mungkin memerlukan file DLL lainnya

Dengan cara yang sama bahwa suatu aplikasi membutuhkan file DLL, file DLL mungkin tergantung pada file DLL lain itu sendiri. Jika salah satu file DLL ini dalam rantai ketergantungan tidak ditemukan, aplikasi tidak akan memuat. Ini mudah disadap menggunakan alat dependensi walker, seperti Dependency Walker .

Ada begitu banyak di folder sistem

Sebagian besar fungsi sistem terpapar ke program pengguna dalam bentuk file DLL karena merupakan bentuk standar kode / sumber daya berbagi. Setiap fungsionalitas disimpan secara terpisah dalam file DLL yang berbeda sehingga hanya file DLL yang diperlukan yang akan dimuat dan dengan demikian mengurangi kendala memori pada sistem.

Aplikasi yang diinstal juga menggunakan file DLL

File DLL juga menjadi bentuk pemisahan fungsi secara fisik seperti yang dijelaskan di atas. Aplikasi yang baik juga mencoba untuk tidak memuat file DLL sampai mereka benar-benar diperlukan, yang mengurangi kebutuhan memori. Ini juga menyebabkan aplikasi untuk mengirim dengan banyak file DLL.

DLL Neraka

Namun, kadang-kadang peningkatan sistem sering merusak program lain ketika ada ketidakcocokan versi antara file DLL bersama dan program yang membutuhkannya. Titik pemeriksaan sistem dan cache DLL, dll. Merupakan inisiatif dari M $ untuk menyelesaikan masalah ini. Platform .NET mungkin tidak menghadapi masalah ini sama sekali.

Bagaimana kita tahu apa yang ada di dalam file DLL?

Anda harus menggunakan alat eksternal seperti DUMPBIN atau Dependency Walker yang tidak hanya akan menunjukkan fungsi apa yang terlihat secara publik (dikenal sebagai ekspor) yang terkandung di dalam file DLL dan juga apa file DLL lain yang diperlukan dan yang diekspor dari file DLL file DLL ini file DLL ini tergantung pada.

Bagaimana cara kita membuat / menggunakannya?

Rujuk dokumentasi pemrograman dari vendor Anda. Untuk C ++, lihat LoadLibrary di MSDN.

kehidupan komputasi
sumber
2
Silakan lengkapi kalimat ini ( "The .NET platform might not face this issue at all.") dengan alasan. Terima kasih.
Jogi
1
@RehanKhan Dimulai dengan .NET Framework v2.0, runtime hanya akan memuat assemble yang dikompilasi dengan versi .NET <= runtime yang saat ini dimuat + .NET juga mem-cache upaya yang gagal untuk memuat assemblies + jika panggilan sebelumnya sudah menemukan assembly, CL runtime akan menggunakan perakitan yang sudah dimuat. Semua dalam semua, saya pikir lebih baik untuk mengatakan bahwa mereka memecahkan masalah dengan menerapkan batasan yang sangat berat pada apa DLL runtime program akan dimuat (sebelum hanya menyerah dan meminta bantuan Anda).
Vladislav Martin
14

Katakanlah Anda membuat executable yang menggunakan beberapa fungsi yang ditemukan di perpustakaan.

Jika pustaka yang Anda gunakan adalah statis , penghubung akan menyalin kode objek untuk fungsi-fungsi ini langsung dari pustaka dan memasukkannya ke dalam executable.

Sekarang jika executable ini dijalankan, ia memiliki semua yang dibutuhkan, jadi loader yang dapat dieksekusi hanya memuatnya ke dalam memori dan menjalankannya.

Jika pustaka dinamis , penghubung tidak akan menyisipkan kode objek melainkan akan memasukkan potongan yang pada dasarnya mengatakan fungsi ini terletak di DLL ini di lokasi ini.

Sekarang jika executable ini dijalankan, bit-file executable hilang (yaitu bertopik) sehingga loader melewati dieksekusi memperbaiki bertopik hilang. Hanya setelah semua bertopik telah diselesaikan maka yang dapat dieksekusi diizinkan untuk berjalan.

Untuk melihat ini dalam tindakan hapus atau ganti nama DLL dan perhatikan bagaimana loader akan melaporkan kesalahan DLL yang hilang ketika Anda mencoba menjalankan executable.

Karena itu namanya Dynamic Link Library , bagian dari proses penautan sedang dilakukan secara dinamis pada saat dijalankan oleh loader yang dapat dieksekusi.

Satu catatan terakhir, jika Anda tidak menautkan ke DLL maka tidak ada tulisan rintisan yang akan disisipkan oleh tautan tersebut, tetapi Windows masih menyediakan API GetProcAddress yang memungkinkan Anda memuat eksekusi titik entri fungsi DLL lama setelah eksekusi dapat dijalankan.

jussij
sumber
12

DLL (pustaka tautan dinamis) dan SL (pustaka bersama, setara dengan UNIX) hanyalah pustaka kode yang dapat dieksekusi yang dapat dihubungkan secara dinamis ke dalam yang dapat dieksekusi pada waktu buka.

Pustaka statis dimasukkan ke dalam executable pada waktu kompilasi dan diperbaiki dari titik itu. Mereka meningkatkan ukuran executable dan tidak bisa dibagi.

Pustaka dinamis memiliki keuntungan sebagai berikut:

1 / Mereka dimuat pada saat dijalankan daripada waktu kompilasi sehingga mereka dapat diperbarui secara terpisah dari executable (semua jendela mewah dan kotak dialog yang Anda lihat di Windows berasal dari DLL sehingga tampilan dan nuansa aplikasi Anda dapat berubah tanpa Anda harus menulis ulang).

2 / Karena independen, kode ini dapat dibagikan ke beberapa yang dapat dieksekusi - ini menghemat memori karena, jika Anda menjalankan 100 aplikasi dengan satu DLL, mungkin hanya ada satu salinan DLL dalam memori.

Kerugian utama mereka adalah keuntungan # 1 - memiliki perubahan DLL independen aplikasi Anda dapat menyebabkan aplikasi Anda berhenti bekerja atau mulai berperilaku dengan cara yang aneh. Versi DLL cenderung tidak dikelola dengan baik di bawah Windows dan ini mengarah ke "DLL Hell" yang disebut quaintly.

paxdiablo
sumber
11

File DLL berisi Tabel Ekspor yang merupakan daftar simbol yang dapat dilihat oleh program panggilan. Simbol biasanya berfungsi dengan konvensi pemanggilan C ( __stcall ). Tabel ekspor juga berisi alamat fungsi.

Dengan informasi ini, program panggilan kemudian dapat memanggil fungsi-fungsi di dalam DLL walaupun tidak memiliki akses ke DLL pada waktu kompilasi.

Memperkenalkan Dynamic Link Library memiliki beberapa informasi lebih lanjut.

Adam Pierce
sumber
6

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

DLL adalah pustaka yang berisi kode dan data yang dapat digunakan oleh lebih dari satu program sekaligus. Misalnya, dalam sistem operasi Windows, Comdlg32 DLL melakukan fungsi terkait kotak dialog umum. Oleh karena itu, setiap program dapat menggunakan fungsi yang terkandung dalam DLL ini untuk menerapkan kotak dialog Terbuka. Ini membantu mempromosikan penggunaan kembali kode dan penggunaan memori yang efisien.

Dengan menggunakan DLL, program dapat dimodulasi menjadi komponen yang terpisah. Misalnya, program akuntansi dapat dijual dengan modul. Setiap modul dapat dimuat ke program utama saat dijalankan jika modul itu diinstal. Karena modul terpisah, waktu buka program lebih cepat, dan modul hanya dimuat saat fungsionalitas itu diminta.

Selain itu, pembaruan lebih mudah diterapkan pada setiap modul tanpa mempengaruhi bagian lain dari program. Misalnya, Anda mungkin memiliki program penggajian, dan tarif pajak berubah setiap tahun. Ketika perubahan ini diisolasi ke DLL, Anda dapat menerapkan pembaruan tanpa perlu membangun atau menginstal keseluruhan program lagi.

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

Jorge Ferreira
sumber
2

DLL adalah format file Extension & Dikenal Sebagai "dynamic link library" yang digunakan untuk menyimpan banyak kode dan prosedur untuk program Windows. Perangkat Lunak & Game berjalan berdasarkan File DLL; File DLL dibuat sehingga beberapa aplikasi dapat menggunakan informasinya pada saat yang bersamaan.

JIKA Anda ingin mendapatkan informasi lebih lanjut tentang File DLL atau menghadapi kesalahan baca posting berikut. https://www.bouncegeek.com/fix-dll-errors-windows-586985/

Akshya Nagar
sumber
1

DLL (Dynamic Link Libraries) mengandung sumber daya yang digunakan oleh satu atau lebih aplikasi atau layanan. Mereka dapat berisi kelas, ikon, string, objek, antarmuka, dan cukup banyak hal apa pun yang perlu disimpan pengembang kecuali UI.

tsilb
sumber
3
Mereka sebenarnya dapat menyimpan UI dan beberapa program melakukan ini. Misalnya snap-in.
Brian R. Bondy
1

Menurut Microsoft

(DLL) Pustaka tautan dinamis adalah file yang berisi data, kode, atau sumber daya yang diperlukan untuk menjalankan aplikasi. Ini adalah file yang dibuat oleh ekosistem windows dan dapat dibagi antara dua atau lebih aplikasi.

Ketika suatu program atau perangkat lunak berjalan pada Windows, sebagian besar cara kerja aplikasi tergantung pada file DLL program. Misalnya, jika aplikasi tertentu memiliki beberapa modul, maka bagaimana masing-masing modul berinteraksi satu sama lain ditentukan oleh file Windows DLL.

Jika Anda ingin penjelasan terperinci, periksa sumber daya yang bermanfaat ini

Apa itu file dll , Tentang file Dll

pembangun kode
sumber