Что находится в 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?

Ответы на вопрос(3)

Ваш ответ на вопрос