Блоки.NET, которые содержат смесь управляемого и неуправляемого кода, не могут быть ILMerged с другими блоками.
Как я могу проверить, содержит ли данный блок.NET чисто управляемый код или соединение управляемого и неуправляемого кода?
Запустите инструмент PEVerify против вашей сборки.
PEVerify.exe устанавливается вместе с Visual Studio, например, этот поставляется с Visual Studio 2012:
C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ PEVerify .exe
Как предлагает 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 предлагает эти флаги не гарантируются, что их правильность, поэтому этот метод не может быть надежным.
Запустите ildasm из командной строки Visual Studio следующим образом:
ildasm file.exe /headers /noil /text
В конце вывода вы увидите:
// ----- CLR Заголовок:
. // Размер заголовка: ...
// Основная версия исполнения: ...
// Незначительная версия исполнения: ...
// ...
// Флаги: 0x00000000
Если флаги имеют наименьший набор битов (например, 0x00000001), то сборка - чистый CLR; если нет (например, 0x00000000), то сборка в смешанном режиме. Обратите внимание, что могут присутствовать и другие флаги, так что это только самый младший интересующий вас бит (так что если последняя цифра 1, 3, 5, 7, 9, b, d или f, то это чистый CLR)
(Правка: Вы также можете запустить ildasm графически, открыть соответствующий исполняемый файл и выбрать заголовки в меню Вид, чтобы увидеть ту же информацию)
.ILMerge только объединяет управляемые сборки, здесь, чтобы процитировать их со страницы загрузки, 'ILMerge - это утилита для объединения нескольких .NET сборок в одну .NET сборку'.
Я не видел управляемой сборки, объединенной с родным двоичным файлом. Технически, их можно было бы объединить как таковые, включив неуправляемый двоичный файл в качестве встроенного ресурса, но загрузка встроенного ресурса в память как двоичный код - я этого раньше не видел. Я пробовал эту технику с использованием карт памяти, но не получилось.
Другой способ проверки - посмотреть в сам бинарный файл, если он имеет 15-ю запись в каталоге данных, и является ненулевым, то это бинарный файл .NET, в родных бинарных файлах этого нет. Смотрите здесь, где я разместил ответ на похожий вопрос.
Надеюсь, это поможет, С наилучшими пожеланиями, Том.
Придется дважды это проверить, но я уверен, что вы сможете это выяснить с помощью рефлектора Redgate.
Я думаю, что для прохождения всех типов и методов в ассемблере следует использовать .NET-отражение.
.