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

Каковы "точные" различия между .NET dll и нормальной dll?

Я хочу знать, каковы точные различия между .NET dll и нормальной dll.

Первый вопрос, что называется "нормальной DLL"? Я использую слово "нормальный". Но это не кажется правильным?

Потому что оба соответствуют формату PE. Да, я согласен с тем, что .NET DLL имеет дополнительный раздел. Кроме того, все это одно и то же.

Я также знаю, что в .NET-коде преобразован в CIL/MSIL, то что заполнено в разделе .text PE файла? MSIL? потому что нет двоичного кода. Но если они помещают MSIL в .text-раздел. Погрузчик предполагает, что его двоичный код и позволяет ему выполнять. Это не так. Что мне не хватает?

Я удивлен, узнав, что

Даже расширение DLL файла искусственный. У вас могут быть библиотеки DLL с совершенно разные расширения - для экземпляр .OCX control и Control Панельные аплеты (файлы .CPL) - это библиотеки DLL.

Какие еще расширения используются для DLL файлов?

Но я могу понять причину использования разных расширений. Почему они не выполняли то же самое в случае .NET DLLS? они могли бы использовать новое расширение, чтобы отличить его от "нормальной" DLL. Они даже имеют другое имя (ASSEMBLY) для dll в .NET, но не могут изменить расширение. а?

Другой совершенно другой вопрос: что такое DLL-регистрация? они используют для этого regsvr32.exe. правильно? Я заметил это, когда установил Windows XP SP3. После установки и перед перезапуском окон я проверил список автозагрузки и нашел много записей regsvr32.exe с большим количеством DLL.

Пожалуйста, не стесняйтесь погружаться в такую ​​глубину, насколько вам нравится. Я изучаю линкеры, загрузчики, двоичные форматы. Я также знаком с форматом файлов PE.

4b9b3361

Ответ 1

Я скопировал и вставил это из мой собственный пост:

Формат .NET dll:

  • Заголовок PE
  • Заголовок CLR
  • Метаданные CLR
  • CLR IL code
  • Собственные данные

Заголовок PE

Заголовок PE - это портативный исполняемый заголовок, который имеет все приложения и библиотеки Win32, и указывает Windows, что делать с файлом. С сборками .NET это загружает CLR, которая, в свою очередь, загружает сборку.

Заголовок CLR

Здесь содержится информация, такая как .NET-версия .exe или сборка была написана с помощью любого сильного хэша подписи имени, адреса (RVA или относительного виртуального адреса) в файле, в котором ресурсы могут быть найдены. И самое главное, точка входа для приложения, которая является токеном, указывающим на таблицу метаданных MethodDef, или другой файл. Этот токен равен 0 для библиотек классов.

Метаданные CLR

Это информация о модуле, который хранится в нескольких разных типах "потоков". Эти потоки обычно сжимаются, за исключением # ~, которые могут быть сжаты для редактирования и продолжения. Потоки бывают двух форм: куча, которая используется только для хранения, и таблицы.

Различные части вашей библиотеки DLL/сборки хранятся в разных таблицах на основе того, что они делают - например, все типы хранятся в таблице TypeRef, все методы в таблице Method. Каждая из таблиц ссылается на родительскую таблицу.

Начальная точка таблиц - это таблица модулей, которая содержит только имя и директив модуля как одну строку. После этого это таблица ModuleRef, которая содержит информацию обо всех модулях, на которые ссылается этот модуль (из той же сборки). В случае VS.NET и его использования csc.exe в сборке нет нескольких файлов, только один модуль.

После этого это таблица TypeDef, содержащая 6 столбцов, содержащих имя типа, пространство имен, его родительское (0 для интерфейсов и Object), стартовую строку для своих полей в таблице FieldDef, начало строки для своих методов в таблице MethodDef,

IL и собственные данные

Само приложение.

книга Внутри Microsoft.NET IL Assembler - Serge Lidin гораздо интереснее, если вам интересно.

Ответ 2

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

Важнейшим отличием является то, что в макете заголовка .NET PE имеется 15-я запись каталога данных, в составной DLL - только 14 записей каталога данных. Вот как вы можете отличить два, для родной DLL, эта запись будет равна нулю! И не только, что .NET DLL будет иметь встроенные в нее метаданные для того, чтобы Framework обрабатывал его соответственно, например, атрибуты, запрашивающие разрешения безопасности и т.д., То же самое относится и к .NET EXE.

В отношении разных расширений, маскируемых как DLL, такие как OCX и CPL, Screen Savers - еще один пример расширения не DLL в смысле слова с точки зрения .EXE, т.е. те, которые являются .SCR действительно .EXE... странно, как это звучит, кажется, что Microsoft сделала некоторые приложения для использования определенного расширения для EXE и DLL, я считаю, что это было приостановлено со времен Windows 3.1, CPL для панели управления, OLE, известная как привязка объектов и встраивание в OCX, теперь ActiveX, SCR для хранителей экрана aka.EXE. Меня не удивит, если это применимо к .MSCc(служебные расширения, используемые в Microsoft Snap In Consoles)

Регистрации DLL, где regsvr32 регистрирует DLL и его идентификатор класса, который будет найден в реестре под ключом HKEY_CLASSES_ROOT, скорее всего это будет для COM (Component Object Model) для того, чтобы сделать COM-объекты глобально видимыми для всех независимо от языка разработки/среды. ActiveX DLL также будет входить в ту же категорию, некоторые из них, как известно, автоматически регистрируются (включая COM DLL), включая их идентификацию библиотеки типов (идентификаторы typelib)...

Много программного обеспечения до Windows 95, используемого, чтобы иметь свою собственную DLL, где-то дублированную, я мог бы помнить, что это был CTL3D.DLL(помните? Это даст Windows Controls 3D-взгляд!). Было так много версий, которые дублировались повсюду, это дублирование и различия версий заключались в том, чтобы привести Windows 95, известную как адский DLL. Именно там, реестр сделал его дебютный вид, когда он был запущен, который был разработан, чтобы обойти аддон DLL, заставив все типовички, зарегистрированные в одном месте, вместо дублирования DLL повсюду, но он не разрешил версии в то время, в результате чего программы были сломанными, поскольку был использован идентификатор класса, используемый DLL, который был заменен более новой версией DLL, из-за которой программы прерывались!

Ответ 3

Единственное, что можно добавить к другим опубликованным ответам, это то, что файл cdc.dll c/С++ - это просто соглашение об именах - вы можете называть его так, как вам нравится, поэтому .ocx и .cpl.
Dll c/С++ - это набор кода и данных, которые загружаются во время выполнения, используя LoadLibrary и отображаемые в адресное пространство вызываемого абонента. Он по-прежнему компилируется в собственный код, но не имеет понятия о целевом адресном пространстве, поскольку он предназначен для исправления и исправления загрузчиком.

Ответ 4

Нормальная DLL

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

.Net DLL

Когда вы реализуете .Net DLL (сборку) на языках .NET, таких как С# или VB.NET, вы создаете управляемую сборку. Управляемая сборка - это компонентный стандарт, указанный .NET. Следовательно, сборки .Net понятны только Microsoft.NET и могут использоваться только в управляемых .NET приложениях.

Дополнительная информация.... Разница между нормальной DLL и .Net Dll?

Matt