Как я узнаю, содержит ли блок.NET неуправляемый код?

Блоки.NET, которые содержат смесь управляемого и неуправляемого кода, не могут быть ILMerged с другими блоками.

Как я могу проверить, содержит ли данный блок.NET чисто управляемый код или соединение управляемого и неуправляемого кода?

11
задан starblue 22 December 2009 в 17:16
поделиться

6 ответов

Запустите инструмент PEVerify против вашей сборки.

PEVerify.exe устанавливается вместе с Visual Studio, например, этот поставляется с Visual Studio 2012:

C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ PEVerify .exe

5
ответ дан 3 December 2019 в 06:46
поделиться

Как предлагает nobugz, более простой способ увидеть флаги CLR - использовать утилиту corflags , которая является частью .NET 2.0 SDK.

Если нет указаны параметры, отображаются флаги для данного изображения:

C:\>corflags Foo.dll
Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 9
ILONLY    : 1
32BIT     : 0
Signed    : 1

Бит «ILONLY» указывает, является ли это чисто управляемой сборкой или смешанной сборкой.

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

9
ответ дан 3 December 2019 в 06:46
поделиться

Запустите ildasm из командной строки Visual Studio следующим образом:

ildasm file.exe /headers /noil /text

В конце вывода вы увидите:

// ----- CLR Заголовок:
. // Размер заголовка: ...
// Основная версия исполнения: ...
// Незначительная версия исполнения: ...
// ...
// Флаги: 0x00000000

Если флаги имеют наименьший набор битов (например, 0x00000001), то сборка - чистый CLR; если нет (например, 0x00000000), то сборка в смешанном режиме. Обратите внимание, что могут присутствовать и другие флаги, так что это только самый младший интересующий вас бит (так что если последняя цифра 1, 3, 5, 7, 9, b, d или f, то это чистый CLR)

(Правка: Вы также можете запустить ildasm графически, открыть соответствующий исполняемый файл и выбрать заголовки в меню Вид, чтобы увидеть ту же информацию)

.
3
ответ дан 3 December 2019 в 06:46
поделиться

ILMerge только объединяет управляемые сборки, здесь, чтобы процитировать их со страницы загрузки, 'ILMerge - это утилита для объединения нескольких .NET сборок в одну .NET сборку'.

Я не видел управляемой сборки, объединенной с родным двоичным файлом. Технически, их можно было бы объединить как таковые, включив неуправляемый двоичный файл в качестве встроенного ресурса, но загрузка встроенного ресурса в память как двоичный код - я этого раньше не видел. Я пробовал эту технику с использованием карт памяти, но не получилось.

Другой способ проверки - посмотреть в сам бинарный файл, если он имеет 15-ю запись в каталоге данных, и является ненулевым, то это бинарный файл .NET, в родных бинарных файлах этого нет. Смотрите здесь, где я разместил ответ на похожий вопрос.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0
ответ дан 3 December 2019 в 06:46
поделиться

Придется дважды это проверить, но я уверен, что вы сможете это выяснить с помощью рефлектора Redgate.

0
ответ дан 3 December 2019 в 06:46
поделиться

Я думаю, что для прохождения всех типов и методов в ассемблере следует использовать .NET-отражение.

.
0
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: