Я всегда ссылаюсь на библиотеки 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?
1b. Что такое процесс «связывания»? Сделаны ли проверки совместимости? Загружается в ту же память? Что на самом деле означает связывание?
Что на самом деле выполняет код в 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?