Я всегда ссылаюсь на библиотеки DLL в своем коде на С#, но они остались загадкой, которую я хотел бы уточнить. Это своего рода мозговой свалкой вопросов относительно DLL.
Я понимаю, что DLL - это динамически связанная библиотека, что означает, что другая программа может получить доступ к этой библиотеке во время выполнения, чтобы получить "функциональность". Однако рассмотрим следующий проект ASP.NET с Web.dll
и Business.dll
(Web.dll
- это функциональность переднего конца и ссылается на Business.dll
для типов и методов).
-
В какой момент
Web.dll
динамически ссылается наBusiness.dll
? Вы часто замечаете, что жесткие диски Windows для кажущихся маленькими задачами при использовании Word (и т.д.), И я считаю, что Word уходит и динамически связывает функциональность с другими DLL?1а. Кроме того, что загружает и связывает DLL - ОС или некоторые рамки времени выполнения, такие как .NET framework?
1b. Каков процесс "связывания"? Выполнены ли проверки совместимости? Загрузка в ту же память? Что означает связь?
-
Что на самом деле выполняет код в DLL? Выполняется ли это процессором или есть еще один этап перевода или компиляции, прежде чем процессор поймет код внутри DLL?
2а. В случае DLL, встроенного в С#.NET, что работает:.NET framework или операционная система напрямую?
-
Является ли DLL из Linux работать в системе Windows (если такая вещь существует) или они зависят от операционной системы?
-
Являются ли библиотеки DLL конкретными для конкретной структуры? Может ли DLL, построенная с использованием С#.NET, использоваться DLL, построенной с помощью, например, Borland С++?
4а. Если ответ на 4 "нет", то в чем же суть DLL? Почему различные фреймворки не используют свои собственные форматы для связанных файлов? Например:.exe, встроенный в .NET, знает, что тип файла .abc - это то, что он может связать с его кодом.
-
Возвращаясь к примеру
Web.dll
/Business.dll
- для получения типа класса клиента мне нужно ссылатьсяBusiness.dll
наWeb.dll
. Это должно означать, чтоBusiness.dll
содержит некоторую спецификацию относительно того, что на самом деле представляет собой класс клиента. Если бы я скомпилировал мой файлBusiness.dll
, скажем, в Delphi: понял бы С# и сможет создать класс клиента, или есть какая-то информация заголовка или что-то, что говорит: "извините, вы можете использовать меня только от другого Delphi DLL"?5а. То же самое относится к методам; могу ли я написать метод
CreateInvoice()
в DLL, скомпилировать его на С++, а затем получить доступ и запустить его с С#? Что останавливает или позволяет мне это делать? -
Что касается захвата DLL, то, конечно, замена (плохая) DLL должна содержать точные подписи и типы методов, которые находятся под угрозой. Я полагаю, это было бы непросто сделать, если бы вы могли узнать, какие методы были доступны в исходной DLL.
6а. Что в моей программе на С# решает, могу ли я получить доступ к другой DLL? Если бы моя захваченная DLL содержала точно такие же методы и типы, что и оригинал, но была скомпилирована на другом языке, работала бы она?
Что такое импорт DLL и регистрация DLL?