Saya selalu mereferensikan DLL dalam kode C # saya, tetapi mereka tetap menjadi misteri yang ingin saya klarifikasi. Ini adalah semacam brain dump pertanyaan tentang DLL.
Saya memahami bahwa DLL adalah pustaka yang terhubung secara dinamis yang berarti bahwa program lain dapat mengakses pustaka ini pada saat dijalankan untuk mendapatkan "fungsionalitas". Namun, pertimbangkan proyek ASP.NET berikut dengan Web.dll
dan Business.dll
( Web.dll
adalah fungsionalitas ujung depan dan referensi Business.dll
untuk jenis dan metode).
Pada titik manakah
Web.dll
link secara dinamisBusiness.dll
? Anda melihat banyak di HDD Windows yang meronta-ronta untuk tugas yang tampaknya kecil saat menggunakan Word (dll.) Dan saya rasa Word akan mati dan secara dinamis menghubungkan fungsionalitas dari DLL lain?1a. Selain itu, apa yang memuat dan menautkan DLL - OS atau beberapa kerangka waktu berjalan seperti kerangka .NET?
1b. Bagaimana proses "menghubungkan"? Apakah pemeriksaan kompatibilitas dilakukan? Memuat ke dalam memori yang sama? Apa sebenarnya arti menghubungkan?
Apa yang sebenarnya mengeksekusi kode di DLL? Apakah itu dijalankan oleh prosesor atau ada tahap terjemahan atau kompilasi lain sebelum prosesor memahami kode di dalam DLL?
2a. Dalam kasus DLL yang dibangun di C # .NET, apa yang menjalankan ini: kerangka .NET atau sistem operasi secara langsung?
Apakah DLL dari Linux berfungsi pada sistem Windows (jika ada hal seperti itu), atau apakah sistem operasinya spesifik?
Apakah DLL khusus untuk kerangka kerja tertentu? Dapatkah DLL yang dibangun menggunakan C # .NET digunakan oleh DLL yang dibangun dengan, misalnya, Borland C ++?
4a. Jika jawaban ke 4 adalah "tidak" lalu apa gunanya DLL? Mengapa berbagai kerangka kerja tidak menggunakan formatnya sendiri untuk file tertaut? Misalnya: sebuah .exe bawaan .NET mengetahui bahwa jenis file .abc adalah sesuatu yang dapat ditautkan ke kodenya.
Akan kembali ke
Web.dll
/Business.dll
contoh - untuk mendapatkan jenis kelas pelanggan saya perlu referensiBusiness.dll
dariWeb.dll
. Ini harus berarti bahwaBusiness.dll
berisi semacam spesifikasi tentang apa sebenarnya kelas pelanggan itu. Jika saya telah menyusun fileBusiness.dll
file di, katakanlah, Delphi: akankah C # memahaminya dan dapat membuat kelas pelanggan, atau apakah ada semacam info header atau sesuatu yang mengatakan "hei maaf Anda hanya dapat menggunakan saya dari DLL Delphi lain" ?5a. Hal yang sama berlaku untuk metode; dapatkah saya menulis
CreateInvoice()
metode dalam DLL, mengkompilasinya dalam C ++, dan kemudian mengakses dan menjalankannya dari C #? Apa yang menghentikan atau mengizinkan saya melakukan ini?Mengenai masalah DLL hijacking, tentunya DLL pengganti (jelek) harus mengandung signature dan type metode yang sama persis seperti yang sedang dibajak. Saya kira ini tidak akan sulit dilakukan jika Anda dapat mengetahui metode apa yang tersedia di DLL asli.
6a. Apa dalam program C # saya yang memutuskan apakah saya dapat mengakses DLL lain? Jika DLL saya yang dibajak berisi metode dan tipe yang persis sama dengan aslinya tetapi dikompilasi dalam bahasa lain, apakah itu akan berhasil?
Apa itu pengimporan DLL dan pendaftaran DLL?