2009-12-16 1 views
2

Я работаю над инструментом параллельной сборки, который строит (среди множества других вещей) программы Windows различных типов. Одной частью нашего инструмента, которая делает жизнь намного проще для наших пользователей, является автоматическое сканирование зависимостей файлов EXE и DLL. Это означает, что если пользователь говорит, что хочет запустить «bob.exe», например, им не нужно беспокоиться о проблемах с зависимостями, когда «bob.exe» получает доступ к другим узлам в сети сборки. Это потому, что мы сканируем «bob.exe», чтобы выяснить, какие DLL-файлы ему нужны, и отправить их вместе с ним.Сканирование зависимостей DLL от исполняемого файла C#

В целом это хорошо работает, если EXE программно загружает DLL. Тогда зависимость должна быть жестко закодирована в файл пользователя. Одна из проблем, с которой мы недавно начали работать, - это то, что нужно делать с библиотеками DLL/EXE. Кажется, что они содержат ссылки на DLL, которые не являются частью формата PE. Я предполагаю, что ссылки находятся внутри какого-либо контейнера C# и что среда выполнения C# просто программно загружает их, когда запускается C# runtime.

Может ли кто-нибудь сказать мне, какой лучший подход был бы для сканирования этих ссылок на двоичном уровне? По этой причине мой инструмент построения является мультиплатформенным, и мой PE-сканер в настоящее время написан на Java. Поэтому я не могу полагаться ни на одну из библиотек .NET. Мой PE-сканер уже может разобрать все разделы в PE-файле, и я использую для разбора раздела, который содержит информацию о сбое сборок для приложений на C++. Мне просто нужны некоторые указатели на то, что делать в случае приложений C# ...

ответ

5

Формат сборок .NET определен стандартом ECMA-335 "Common Language Infrastructure (CLI)", в частности «Раздел II: определение метаданных и семантика», который свободно доступен для скачать. Вы можете использовать это, чтобы написать свой собственный парсер Java для них, который будет извлекать ссылки.

+0

Полезно, спасибо. В частности, для ссылки на соответствующую спецификацию. – Benj

2

Вы можете использовать (или взять вдохновение из) pe-file-reader библиотеки:

Эта библиотека читает сборки .NET и модуля .net файлы (портативные исполняемые файлы ; управляемые исполнымых). .Net хранятся модули и монтажные файлы в соответствии со стандартом ECMA 335.

+0

О, отлично! Это выглядит очень полезно. – Benj