Что находится в DLL и как это работает?
Я всегда ссылаюсь на библиотеки DLL в своем коде на C #, но они до сих пор остаются загадкой, которую я хотел бы уточнить. Это своего рода мозговая свалка вопросов, касающихся DLL.
Я понимаю, что DLL - это динамически связанная библиотека, что означает, что другая программа может получить доступ к этой библиотеке во время выполнения, чтобы получить «функциональность». Однако рассмотрим следующий проект ASP.NET сWeb.dll
а такжеBusiness.dll
(Web.dll
это функциональность внешнего интерфейса, и это ссылкиBusiness.dll
для типов и методов).
В какой моментWeb.dll
динамически ссылаться наBusiness.dll
? Вы замечаете, что на жестком диске Windows часто возникают проблемы с кажущимися небольшими задачами при использовании Word (и т. Д.), И я считаю, что Word отключается и динамически связывает функциональность из других библиотек DLL?
1a. Кроме того, что загружает и связывает 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 # понять его и сможет ли создать класс клиента, или есть какая-то информация заголовка или что-то вроде «эй, извините, вы можете использовать меня только из другой Delphi DLL»?
5а. То же самое относится и к методам; могу я написатьCreateInvoice()
метод в DLL, скомпилировать его в C ++, а затем получить доступ и запустить его из C #? Что останавливает или позволяет мне это делать?
Что касается перехвата DLL, конечно, замещающая (плохая) DLL должна содержать точные сигнатуры и типы методов, как тот, который перехватывается. Я полагаю, это не составит труда, если бы вы могли узнать, какие методы были доступны в исходной DLL.
6а. Что в моей программе на C # решает, могу ли я получить доступ к другой DLL? Если бы моя угнанная DLL содержала те же методы и типы, что и оригинал, но была скомпилирована на другом языке, это сработало бы?
Что такое импорт DLL и регистрация DLL?