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

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

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

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

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

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

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

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

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

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

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


person Buttler    schedule 13.02.2010    source источник
comment
формат файла такой же. Свое ЧП с новым разделом. Меня смущает двоичный код и код MSIL. куда они идут? что будет в разделе .text. Что куда идет и т.д ..   -  person Buttler    schedule 14.02.2010
comment
@Randy - эта ссылка даже отдаленно не отвечает на заданный здесь вопрос. Вдобавок к этому немедленная отправка кого-либо в Google здесь не одобряется.   -  person John Rasch    schedule 14.02.2010
comment
+1 от меня - хороший вопрос и интересный! :)   -  person t0mm13b    schedule 14.02.2010
comment
Вы не регистрируете .NET dll / exe с помощью regsvr32, - CLR сам является COM-сервером: o)   -  person Chris S    schedule 14.02.2010
comment
Вы не регистрируете .NET dll / exe с помощью regsvr32, - среда CLR сама по себе является COM-сервером. Что это значит?   -  person Buttler    schedule 14.02.2010


Ответы (4)


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

Формат .NET dll:

  • Заголовок PE
  • Заголовок CLR
  • Метаданные CLR
  • Код CLR IL
  • Родные данные

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

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

Книга Inside Microsoft .NET IL Assembler - Серж Лидин если вам интересно, то мы расскажем гораздо больше.

person Chris S    schedule 13.02.2010

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

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

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

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

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

person t0mm13b    schedule 13.02.2010
comment
Нет файлы * .msc не являются файлами PE. Удивительно, но это файлы XML. да, я это проверил. попробуйте открыть C: \ WINDOWS \ system32 \ compmgmt.msc, C: \ WINDOWS \ system32 \ diskmgmt.msc и т. д. в своем блокноте. :) - person Buttler; 14.02.2010
comment
Когда мы набираем diskmgmt.msc при запуске или в командной строке (и нажимаем Enter), мне интересно, как командная строка преобразуется в: "C:\WINDOWS\system32\mmc.exe" "C:\WINDOWS\system32\diskmgmt.msc" - person Buttler; 14.02.2010
comment
@Buttler: Это просто стандартная магия Windows. Это похоже на ввод mydocument.doc, а затем открывается Word. Файлы с расширением .msc отображаются с помощью ключей реестра HKCR\.msc и HKCR\mscfile, которые открываются с помощью mmc.exe. - person Dirk Vollmar; 14.02.2010
comment
@Buttler: Я согласен с divo по этому поводу. Вот как вы можете запускать определенные программы, в реестре есть «обработчики расширений», которые знают, на основе расширения, будь то .doc, .scr, .msc, с каким приложением открываться. Ничего особенного в этом нет ... - person t0mm13b; 15.02.2010

Обычная DLL

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

.Net DLL

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

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

Мэтт

person Matt    schedule 03.06.2013

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

person zebrabox    schedule 13.02.2010