Подтвердить что ты не робот

Что в DLL и как оно работает?

Я всегда ссылаюсь на библиотеки 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?

4b9b3361

Ответ 1

Здесь я иду, не стесняйтесь указывать на какие-либо ошибки. Я не совсем эксперт с внутренними компонентами Windows...

Прежде всего, вам нужно понять разницу между двумя очень разными типами DLL. Microsoft решила пойти с теми же расширениями файлов (.exe и .dll) как с .NET(управляемым кодом), так и с собственным кодом, однако управляемые DLL файлы и собственные DLL файлы сильно отличаются друг от друга.

1) В какой момент web.dll динамически ссылается на business.dll? Вы много заметят в жестком диске Windows для кажущихся небольшие задачи, когда используя Word и т.д., и я считаю, что это Слово уходит и динамично ссылки на функциональность из других DLL?

1) В случае .NET DLL обычно загружаются по требованию, когда выполняется первый метод, пытающийся получить доступ к чему-либо из DLL. Вот почему вы можете получить TypeNotFoundExceptions в любом месте вашего кода, если DLL не может быть загружена. Когда что-то вроде Word внезапно начинает доступ к жесткому диску, он, вероятно, меняет местами (получая данные, которые были выгружены на диск, чтобы освободить место в ОЗУ)

1a) Кроме того, какие нагрузки и ссылки DLL - O/S или некоторые среда выполнения, такая как .Net framework?

1a) В случае управляемых DLL, платформа .NET - это то, что загружается, JIT компилирует (компилирует байт-код .NET в собственный код) и связывает библиотеки DLL. В случае родных DLL это компонент операционной системы, который загружает и связывает DLL (компиляция не требуется, потому что собственные DLL уже содержат собственный код).

1b) Каков процесс "связывания"? Проверяются ли проверки совместимость? Загрузка в ту же память? Что связывает на самом деле означает?

1b) Связывание - это когда ссылки (например, вызовы методов) в вызывающем коде на символы (например, методы) в DLL заменяются фактическими адресами вещей в DLL. Это необходимо, потому что возможные адреса объектов в DLL не могут быть известны до того, как они будут загружены в память.

2) Что фактически выполняет код в DLL? Выполняется ли оно процессор или есть другой этап перевода или компиляции до того, как процессор поймет код внутри DLL?

2) В Windows файлы EXE и DLL файлы совершенно идентичны. Файлы Native.exe и .dll содержат собственный код (тот же самый материал, который выполняет процессор), поэтому нет необходимости переводить. Управляемые файлы .exe и .dll содержат .NET bytecode, который сначала скомпилирован JIT (переведен в собственный код).

2a) В случае DLL, построенного из С#.net, что это такое?.Net или операционная система напрямую?

2a) После того, как код был скомпилирован JIT, он работал точно так же, как и любой код.

3) Говорит ли DLL, что Linux работает в системе Windows (если такая вещь существует) или они зависят от операционной системы?

3) Управляемые DLL файлы могут работать как есть, при условии, что рамки на обеих платформах обновлены, и тот, кто писал DLL, не намеренно нарушал совместимость, используя собственные вызовы. Собственные библиотеки DLL не будут работать как в режиме, так как форматы разные (хотя машинный код внутри один и тот же, если они оба предназначены для одной и той же процессорной платформы). Кстати, в Linux "DLL" известны как файлы .so(shared object).

4) Являются ли они конкретными для конкретной структуры? Может ли DLL построить с использованием С#.Net будет использоваться DLL, построенной с Borland С++ (только пример)?

4) Управляемые DLL файлы относятся к платформе .NET, но, естественно, они работают с любым совместимым языком. Собственные библиотеки DLL совместимы до тех пор, пока все используют одни и те же соглашения (вызывающие соглашения (как передаются аргументы функции на уровне машинного кода), именование символов и т.д.)

5) Вернемся к примеру web.dll/business.dll. Чтобы получить класс тип клиента Мне нужно ссылаться на business.dll из web.dll. Эта должен означать, что business.dll содержит спецификацию какого-либо рода что на самом деле представляет собой класс клиентов. Если бы я скомпилировал свой файл business.dll файл в Delphi будет С# понимать его и иметь возможность создать класс клиента - или есть какая-то информация заголовка или что-то который говорит: "Эй, извините, вы можете использовать меня только из другой delphi dll".

5) Управляемые библиотеки DLL содержат полное описание каждого класса, метода, поля и т.д., которые они содержат. AFAIK Delphi не поддерживает .NET, поэтому он будет создавать собственные DLL файлы, которые не могут использоваться в .NET прямо. Вероятно, вы сможете вызывать функции с помощью PInvoke, но определения классов не будут найдены. Я не использую Delphi, поэтому я не знаю, как он хранит информацию о типе с DLL. Например, С++ использует файлы заголовков (.h), которые содержат объявления типов и должны быть распространены с помощью DLL.

6) Что касается захвата DLL, то, конечно, замена (плохая) DLL должен содержать точные сигнатуры метода, типы, которые являются будучи захваченным. Я полагаю, это было бы непросто сделать, если бы вы могли найти какие методы и т.д. были доступны в исходной DLL.

6) Действительно, это не сложно сделать, если вы можете легко переключить DLL. Чтобы избежать этого, можно использовать подписание кода. Чтобы кто-то заменил подписанную DLL, они должны были знать ключ подписи, который он сохранял в секрете.

6a) Здесь немного повторяющегося вопроса, но это связано с тем, что в моем Программа С# решает, могу ли я получить доступ к другой DLL? Если моя захваченная DLL содержал точно такие же методы и типы, что и оригинал, но он был скомпилирован в другом lanugage, если бы он работал?

6a) Это будет работать до тех пор, пока это управляемая DLL, сделанная с любым языком .NET.

  • Что такое импорт DLL? и регистрации dll?

"Импорт DLL" может означать много вещей, обычно это означает ссылку на DLL файл и использование в нем вещей.

Регистрация DLL - это то, что сделано в Windows, чтобы глобально регистрировать DLL файлы как COM-компоненты, чтобы сделать их доступными для любого программного обеспечения в системе.

Ответ 2

1) В какой момент web.dll динамически ссылается на business.dll? Вы много заметят в жестком диске Windows для кажущихся небольшие задачи, когда используя Word и т.д., и я считаю, что это Слово уходит и динамично ссылки на функциональность из других DLL?

1) Я думаю, вы путаете связь с загрузкой. Ссылка - это когда все проверки и противовесы проверены, чтобы быть уверенным, что запрашивается. Во время загрузки части DLL загружаются в память или заменяются на файл подкачки. Это активность HD, которую вы видите.

Динамическое связывание отличается от статической привязки тем, что при статической привязке весь объектный код помещается в основной файл .exe во время ссылки. При динамической компоновке объектный код помещается в отдельный файл (dll), и он загружается в другое время из .exe.

Динамическое связывание может быть неявным (например, соединение с импортом lib) или явным (например, приложение использует LoadLibrary (ex) для загрузки dll).

В неявном случае /DELAYLOAD можно использовать для откладывания загрузки dll до тех пор, пока приложение действительно не понадобится. В противном случае, как минимум часть его загружается (отображается в адресное пространство процесса) как часть инициализации процесса. DLL также может запрашивать что он никогда не будет выгружен, пока процесс активен.

COM использует LoadLibrary для загрузки COM-библиотек. Обратите внимание, что даже в неявном случае система использует что-то похожее на LoadLibrary для загрузки DLL либо при запуске процесса, либо при первом использовании.

2) Что фактически выполняет код в DLL? Выполняется ли оно процессор или есть другой этап перевода или компиляции до того, как процессор поймет код внутри DLL?

2) Dll содержат объектный код так же, как и .exes. Формат DLL файла почти идентичен формату EXE файла. Я слышал, что в заголовках этих двух файлов есть только один бит.

В случае библиотеки DLL, построенной из С#.net, инфраструктура .Net запускает ее.

3) Говорит ли DLL, что Linux работает в системе Windows (если такая вещь существует) или они зависят от операционной системы?

3) Библиотеки DLL специфичны для платформы.

4) Являются ли они конкретными для конкретной структуры? Может ли DLL построить с использованием С#.Net будет использоваться DLL, построенной с Borland С++ (только пример)?

4) Dll могут взаимодействовать с другими фреймворками, если будет предпринята особая осторожность или будет написан дополнительный код клея.

Dll очень полезны, когда компания продает несколько продуктов, которые имеют перекрывающиеся возможности. Например, я поддерживаю dll растрового ввода-вывода, который используется более чем 30 различными продуктами в компании. Если у вас установлено несколько продуктов, одно обновление DLL может обновить все продукты до новых растровых форматов.

5) Вернемся к примеру web.dll/business.dll. Чтобы получить класс тип клиента Мне нужно ссылаться на business.dll из web.dll. Эта должен означать, что business.dll содержит спецификацию какого-либо рода что на самом деле представляет собой класс клиентов. Если бы я скомпилировал свой файл business.dll файл в Delphi будет С# понимать его и иметь возможность создать класс клиента - или есть какая-то информация заголовка или что-то который говорит: "Эй, извините, вы можете использовать меня только из другой delphi dll".

5) В зависимости от платформы возможности dll представлены различными способами, через .h файлы,.tlb файлы или другие способы в .net.

6) Что касается захвата DLL, то, конечно, замена (плохая) DLL должен содержать точные сигнатуры метода, типы, которые являются будучи захваченным. Я полагаю, это было бы непросто сделать, если бы вы могли найти какие методы и т.д. были доступны в исходной DLL.

6) dumpbin/exports и dumbin/import - интересные инструменты для использования на .exe и .dlls

Ответ 3

Файл .dll содержит скомпилированный код, который вы можете использовать в своем приложении.

Иногда инструмент, используемый для компиляции .dll, иногда имеет значение. Если вы можете ссылаться на .dll в своем проекте, не имеет значения, какой инструмент использовался для кодирования открытых функций .dll.

Связывание происходит во время выполнения, в отличие от статически связанных библиотек, таких как ваши классы, которые связаны во время компиляции.

Вы можете думать о .dll как о черном ящике, который обеспечивает то, что требует ваше приложение, которое вы не хотите писать сами. Да, кто-то, кто понимает подпись .dll, может создать другой DLL файл с другим кодом внутри него, и ваше вызывающее приложение не сможет узнать разницу.

НТН

Ответ 4

Файл Dll скомпилирован с выходом нашего исходного кода. Что мы пишем в VS или каком-либо другом инструменте, будем называть исходным кодом. После написания на компьютерах необходимо понимать выполнение необходимых действий. Так что мы выполняем операцию сборки, где код будет преобразован в языки машинного уровня.
Таким образом, встроенный файл известен как Dll файл.