Я завжди посилаюся на бібліотеки DLL у своєму коді C #, але вони залишаються дещо загадкою, яку я хотів би пояснити. Це свого роду мозок запитань щодо DLL.
Я розумію, що DLL - це динамічно пов’язана бібліотека, що означає, що інша програма може отримати доступ до цієї бібліотеки під час виконання, щоб отримати "функціональність". Однак, розглянемо наступний проект ASP.NET з Web.dll
та Business.dll
( Web.dll
це функція інтерфейсу та посилання Business.dll
на типи та методи).
На якому етапі
Web.dll
динамічно пов’язуєтьсяBusiness.dll
? Ви помічаєте багато в обмолці жорстких дисків Windows для, здавалося б, невеликих завдань при використанні Word (тощо), і я вважаю, що Word вимикається і динамічно пов'язує функціональність з іншими бібліотеками DLL?1а. Крім того, що завантажує та пов'язує DLL - ОС або деякі рамки часу виконання, такі як .NET Framework?
1б. Що таке процес «зв’язування»? Чи проводяться перевірки сумісності? Завантаження в ту саму пам’ять? Що насправді означає посилання?
Що насправді виконує код у DLL? Чи виконується процесором чи існує інший етап перекладу чи компіляції, перш ніж процесор зрозуміє код всередині DLL?
2а. У випадку DLL, вбудованої в C # .NET, що це працює: платформа .NET або операційна система безпосередньо?
Чи працює DLL з Linux в системі Windows (якщо така ситуація існує), чи це конкретна операційна система?
Чи є DLL специфічними для певного фреймворку? Чи може DLL, побудована за допомогою C # .NET, використовуватися DLL, побудована, наприклад, за допомогою Borland C ++?
4а. Якщо відповідь на 4 - "ні", то який сенс у DLL? Чому різні фреймворки не використовують власні формати для пов'язаних файлів? Наприклад: .exe, вбудований у .NET, знає, що тип файлу .abc - це те, що він може зв’язати зі своїм кодом.
Повертаючись до
Web.dll
/Business.dll
наприклад - отримати тип класу для клієнта мені потрібно посиланняBusiness.dll
зWeb.dll
. Це повинно означати, щоBusiness.dll
містить якусь специфікацію щодо того, що насправді є класом клієнта. Якби я скомпілював свійBusiness.dll
файл у, скажімо, Delphi: C # зрозумів би це і зміг би створити клас замовника, чи існувала якась інформація про заголовки або щось таке, що говорить "привіт, ви можете використовувати мене лише з іншої DLL-бібліотеки Delphi" ?5а. Те саме стосується методів; чи можу я написати
CreateInvoice()
метод у DLL, скомпілювати його на C ++, а потім отримати доступ і запустити його з C #? Що зупиняє або дозволяє мені це робити?Що стосується викрадення DLL, безумовно, заміна (погана) DLL повинна містити точні підписи та типи методів, як той, який викрадається. Я гадаю, це не складно було б зробити, якби ви могли дізнатися, які методи були доступні в оригінальній DLL.
6а. Що в моїй програмі C # вирішує, чи можу я отримати доступ до іншої DLL? Якби моя викрадена DLL містила точно такі ж методи та типи, що і оригінал, але вона була скомпільована іншою мовою, чи спрацювало б це?
Що таке імпорт DLL та реєстрація DLL?