Каковы "точные" различия между .NET DLL и нормальной DLL? - PullRequest
32 голосов
/ 14 февраля 2010

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

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

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

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

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

Даже расширение DLL файла искусственный. Вы можете иметь DLL с совершенно разные расширения - для Экземпляры .OCX Controls и Control Апплеты панели (файлы .CPL) являются DLL.

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 14 февраля 2010

Я скопировал и вставил это из моего собственного сообщения на него:

Формат dll .NET:

  • PE заголовок
  • CLR header
  • метаданные CLR
  • код CLR IL
  • Собственные данные

PE заголовок

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

CLR header

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

метаданные CLR

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

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

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

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

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

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

Книга Внутри Microsoft .NET IL Assembler - Серж Лидин , если вам интересно, подробно расскажет.

4 голосов
/ 14 февраля 2010

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

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

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

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

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

1 голос
/ 03 июня 2013

Нормальная DLL

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

.Net DLL

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

подробнее ... Разница между обычной DLL и .Net Dll?

Мэтт

0 голосов
/ 14 февраля 2010

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

...