Что такое DLL и как это работает?
Я всегда ссылаюсь на DLL в моем коде C#, но они остались чем-то вроде тайны, которую я хотел бы прояснить. Это своего рода дамп мозга вопросов, касающихся DLL.
Я понимаю, что DLL-это динамически связанная библиотека, Что означает, что другая программа может получить доступ к этой библиотеке во время выполнения, чтобы получить "функциональность". Тем не менее, рассмотрим следующий проект ASP.NET с Web.dll и Business.dll (Web.dll это функциональность переднего плана, и он ссылается Business.dll для типов и методов).
в какой момент
Web.dllдинамическая ссылка наBusiness.dll? Вы замечаете много в Windows HDD thrashing для, казалось бы, небольших задач при использовании Word (и т. д.) и я считаю, что Word отключается и динамически связывается с функциональностью из других DLL?
1А. Кроме того, что загружает и одной ДЛЛ - ОС или некоторые рамки время выполнения, такие как .Net фреймворка?
1Б. В чем заключается процесс "увязки"? Являются проверка совместимости? Загрузка в ту же память? Что на самом деле означает связывание?
что на самом деле выполняет код в DLL? Выполняется ли он процессором или есть еще один этап перевода или компиляции, прежде чем процессор поймет код внутри DLL?
2a. в случае DLL, встроенной в C# .NET, что работает: .NET framework или операционная система напрямую?
работает ли DLL из Linux в системе Windows (если такая вещь существует), или они специфичны для операционной системы?
являются ли DLL специфичными для конкретной структуры? Можете библиотеки DLL, построенные с использованием C# .Чистая использоваться как библиотеки DLL, построенные, например, Borland с++?
4а. Если ответ на вопрос 4 "нет", тогда какой смысл библиотеки DLL? Почему различные фреймворки не используют свои собственные форматы для связанных файлов? Например: .exe встроенный в .NET знает, что тип файла .abc-это то, что он может связать в свой код.
возвращаемся к
Web.dll/Business.dllпример-чтобы получить тип класса клиента мне нужно ссылатьсяBusiness.dllСWeb.dll. Это должно означать, чтоBusiness.dllсодержит некоторую спецификацию относительно того, что такое класс клиента на самом деле. Если бы я собрал мойBusiness.dllfile in, скажем, Delphi: будет ли C# понимать это и сможет ли создать класс customer, или есть некоторые своего рода информация заголовка или что-то, что говорит: "Эй, извините, вы можете использовать меня только из другой библиотеки Delphi DLL"?
5а. То же самое касается методов, я могу написать
CreateInvoice()метод в DLL, скомпилировать его в C++, а затем получить доступ и запустить его из C#? Что останавливает или позволяет мне делать это?
по вопросу о захвате DLL, конечно, замена (плохая) DLL должна содержать точные сигнатуры метода и типы, как тот, который угоняется. Я полагаю, что это было бы не трудно сделать, если бы вы могли узнать, какие методы были доступны в исходной DLL.
6а. Что в моем c# программа решает, если я могу получить доступ к другой DLL? Если бы моя захваченная DLL содержала точно такие же методы и типы, как и оригинал, но она была скомпилирована на другом языке, будет ли она работать?
что такое импорт DLL и регистрация DLL?
3 ответов:
прежде всего, вам нужно понять разницу между двумя очень разными типами DLL. Microsoft решила пойти с теми же расширениями (.exe и .dll) как с .NET (управляемый код), так и с собственным кодом, однако управляемые библиотеки DLL и собственные библиотеки DLL являются очень разные внутри.
1) в какой момент работает web.dll динамически подключается к бизнесу.dll? Вы обратите внимание на многое в Windows HDD thrashing для, казалось бы, небольших задач, когда используя слова и т. д. И я считайте, что это слово уходит и динамически связывание в функциональности из других DLL?
1) в случае .NET DLL обычно загружаются по требованию, когда выполняется первый метод, пытающийся получить доступ к чему-либо из DLL. Вот почему вы можете получить TypeNotFoundExceptions в любом месте вашего кода, если DLL не может быть загружен. Когда что-то вроде Word внезапно начинает обращаться к жесткому диску много, это, вероятно, замена (получение данных, которые были заменены на диск, чтобы освободить место в ОЗУ)
1a) кроме того, что загружает и связывает DLL-O / S или некоторые среда выполнения, например .Net framework?
1а) в случае управляемых DLL-библиотеки .Framework является то, что нагрузки, при JIT-компиляции (компиляции .Чистый байткод в машинный код) и ссылки на библиотеки DLL. В случае собственных библиотек DLL это компонент операционной системы, который загружает и связывает DLL (компиляция не требуется, потому что собственные библиотеки DLL уже содержат собственные код.)
1b) что такое процесс "связывания"? Проверяет наличие совместимость? Загрузка в ту же память? Что такое связывание на самом деле имею в виду?
1b) связывание-это когда ссылки (например, вызовы методов) в вызывающем коде на символы (например, методы) в DLL заменяются фактическими адресами вещей в DLL. Это необходимо, потому что возможные адреса вещей в DLL не могут быть известны до его загрузки в память.
2) что на самом деле выполняет код в DLL? Выполняется ли это процессор или есть другой этап перевода или компиляции прежде чем процессор поймет код внутри DLL?
2) На Windows, .EXE файлы и .dll файлы совершенно идентичны. Родной.exe и .dll-файлы содержат собственный код (тот же самый материал, который выполняет процессор), поэтому нет необходимости переводить. Управляемый.exe и .dll-файлы содержат .Чистая байт-код, который сначала компилируется JIT (переводится в собственный код).
2a) в случае DLL, построенной из C# .net, что это работает? Этот .Net framework или непосредственно операционная система?
2a) после того, как код был скомпилирован JIT, он выполняется точно так же, как и любой код.
3) работает ли DLL от say Linux в системе Windows (если такая вещь существует) или они операционная система конкретно?
3) управляемые DLL могут работать как есть, пока фреймворки на обеих платформах обновлены, и тот, кто написал DLL, не намеренно нарушал совместимость с помощью собственных вызовов. Собственные библиотеки DLL не будут работать как входящие, так как форматы различны (даже если машинный код внутри одинаков, если они оба для одной и той же процессорной платформы). Кстати, в Linux "DLL" известны как файлы.so (shared object).
4) являются ли они конкретными к конкретным рамкам? Можно ли построить DLL с помощью C# .Net будет использоваться DLL, построенной с Borland C++ (только пример)?
4) управляемые библиотеки DLL являются особыми для .NET framework, но, естественно, они работают с любым совместимым языком. Собственные библиотеки DLL совместимы до тех пор, пока все используют одни и те же соглашения (соглашения о вызове (как аргументы функции передаются на уровне машинного кода), именование символов и т. д.)
5) Возвращение в сеть.dll / бизнес.файл DLL образец. Чтобы получить класс тип клиента мне нужно ссылаться на бизнес.DLL из интернета.файл DLL. Этот должно быть, так оно и есть.dll содержит спецификацию какого-то вида что такое класс клиентов на самом деле. Если бы я собрал свой бизнес.файл DLL файл в Делфи бы сказать, в C# это понимать и уметь создать класс клиента - или есть какая-то информация заголовка или что-то еще это говорит: "Эй, извините, вы можете использовать меня только из другой библиотеки Delphi dll".
5) управляемые библиотеки DLL содержат полное описание каждого класса, метода, поля, и т. д. Они содержат. Насколько мне известно Делфи не поддерживает .Чистая, так что это будет создавать собственные DLL-библиотеки, которые не могут быть использованы в .Чистая straightforwadly. Вероятно, вы сможете вызывать функции с помощью PInvoke, но определения классов не будут найдены. Я не использую Delphi, поэтому я не знаю, как он хранит информацию о типе С DLL. C++, например, полагается на заголовок (.h) файлы, которые содержат объявления типов и должны распространяться вместе с DLL.
6) на предмет угона DLL, конечно, замена (плохая) DLL должен содержать точные сигнатуры методов, как видов быть угнанным. Я полагаю, что это не было бы трудно сделать, если бы вы могли найти какие методы и т. д. были доступны в исходной DLL.
6) действительно, это не трудно сделать, если вы можете легко переключить DLL. Чтобы избежать этого, можно использовать подпись кода. Для того, чтобы кто-то заменил подписанную DLL, они должны были бы знать ключ подписи, что он держал в секрете.
6a) немного повторный вопрос здесь, но это возвращается к тому, что в моем Программа C# решает, могу ли я получить доступ к другой DLL? Если моя угнанная DLL содержит точно такие же методы и типы, как и оригинал, но это был ли он скомпилирован в другом языке, будет ли он работать?
6a) он будет работать до тех пор, пока это управляемая DLL, сделанная с любым языком .NET.
- что такое импорт DLL? и dll Регистрация?
"импорт DLL" может означать много вещей, обычно это означает ссылку на файл DLL и использование вещей в нем.
Регистрация DLL-это то, что делается в Windows для глобальной регистрации DLL-файлов в качестве компонентов COM, чтобы сделать их доступными для любого программного обеспечения в системе.
A .dll-файл содержит скомпилированный код, который можно использовать в приложении.
иногда инструмент используется для компиляции .dll имеет значение, иногда нет. Если вы можете ссылаться .dll в вашем проекте, это не имеет значения, какой инструмент был использован для кодирования .открытые функции dll.
связывание происходит во время выполнения, в отличие от статически подключаемых библиотек, таких как классы, которые связаны во время компиляции.
вы можете думать о a .DLL как черный ящик, который обеспечивает что-то ваших потребностей, что вы не хотите писать сами. Да, кто-то понимающий .подпись dll может создать другую .dll-файл с другим кодом внутри него, и Ваше вызывающее приложение не может знать разницы.
HTH
1) в какой момент работает web.dll динамически подключается к бизнесу.dll? Вы обратите внимание на многое в Windows HDD thrashing для, казалось бы, небольших задач, когда используя слово и т. д., И я считаю, что это слово уходит и динамически связывание в функциональности из других DLL?
1) я думаю, что вы путаете связь с нагрузкой. Ссылка-это когда все сдержки и противовесы проверяются, чтобы убедиться, что то, что запрашивается, доступно. Во время загрузки, части dll являются загружается в память или заменяется на файл подкачки. Это HD-активность, которую вы видите.
динамическое связывание отличается от статического связывания тем, что в статическом связывании весь объектный код помещается в основной .исполняемые во время ссылки. При динамической компоновке объектный код помещается в отдельный файл (dll) и загружается в другое время.исполняемый.
динамическое связывание может быть неявным (т. е. ссылки приложения с библиотекой импорта) или явным (т. е. приложение использует LoadLibrary (ex) для загрузки dll).
в неявном случае /DELAYLOAD можно использовать для отсрочки загрузки dll до тех пор, пока приложение действительно не понадобится. В противном случае, по крайней мере некоторые его части загружаются (отображаются в адресное пространство процесса) как часть инициализации процесса. Dll также может запросить что он никогда не будет выгружен, пока процесс активен.
com использует функции LoadLibrary, чтобы загрузить DLL-библиотеки com. Обратите внимание, что даже в неявном случае система использует что-то похожее на LoadLibrary для загрузки dll либо при запуске процесса, либо при первом использовании.
2) что на самом деле выполняет код в DLL? Выполняется ли это процессор или есть другой этап перевода или компиляции прежде чем процессор поймет код внутри DLL?
2) DLL содержат объектный код так же, как .Франко. Формат dll-файла практически идентичен формату exe-файла. Я слышал, что существует только один бит, который отличается в заголовках двух файлов.
в случае библиотеки DLL, построенной из C# .net, ее запускает платформа .Net framework.
3) работает ли DLL от say Linux в системе Windows (если такая вещь существует) или они специфичны для операционной системы?
3) библиотеки DLL зависят от платформы.
4) являются ли они специфичными для конкретной структуры? Можно ли построить DLL с помощью C# .Net будет использоваться DLL построенный с Borland C++ (только пример)?
4) библиотеки DLL могут взаимодействовать с другими фреймворками, если соблюдается особая осторожность или написан дополнительный код клея.
библиотеки DLL очень полезны, если компания продает несколько продуктов, которые имеют перекрывающиеся функции. Например, я поддерживаю растровую библиотеку ввода-вывода dll, которая используется более чем 30 различными продуктами в компании. Если у вас установлено несколько продуктов, одно обновление dll может обновить все продукты до новые Растровые форматы.
5) Возвращение в сеть.dll / бизнес.пример dll. Чтобы получить класс тип клиента мне нужно ссылаться на бизнес.DLL из интернета.файл DLL. Этот должно быть, так оно и есть.dll содержит спецификацию какого-то вида что такое класс клиентов на самом деле. Если бы я собрал свой бизнес.файл DLL файл в Делфи бы сказать, в C# это понимать и уметь создать класс клиента - или есть какая-то информация заголовка или что-то еще что говорит "Эй, извините, вы можете используйте меня только из другой библиотеки Delphi dll".
5) в зависимости от платформы, возможности dll представлены различными способами, через .H-файлы, .tlb файлы, или другими способами на. net.
6) на предмет угона DLL, конечно, замена (плохая) DLL должен содержать точные сигнатуры методов, как видов быть угнанным. Я полагаю, что это не было бы трудно сделать, если бы вы могли найти какие методы и т. д. были доступны в оригинале файл DLL.
6) dumpbin /exports и dumbin /imports-интересные инструменты для использования .exe и .библиотеки DLL
Comments