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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

ildasm file.exe/headers/noil/text

В конце вывода вы увидите следующее:

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

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

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

Ответ 4

Улучшение ответа, приведенного выше Wim...

  • Найдите ваш "PEVerify.exe" - у вас есть это, если у вас установлено VS.- КОПИРОВАТЬ ПОЛНУЮ ПУТЬ В файл PEVerify.exe, ваш путь будет другим - - Пример: C:\Program Файлы (x86)\Microsoft SDK\Windows\v8.0A\bin\NETFX 4.0 Tools\PEVerify.exe

  • Откройте командную строку Visual Studio (не выполняйте ее как "Администратор" )

  • Введите cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools

  • теперь в командной строке должен появиться этот длинный текст, а не только C:\или что-то... он укажет на путь, где находится PEVerify.exe.

  • Теперь введите: peverify "your full path to your dll you want to check - THEN Нажмите Enter - вот мой пример: peverify "G:\TestFolder\My_Managed_OR_Unmanaged.dll"

  • После того, как вы нажмете Enter и вы получите сообщение, как показано ниже, его 100% управляемая dll - Все классы и методы в My_Managed_OR_Unmanaged.dll Verified. "

Ответ 5

Мне придется дважды проверить это, но я уверен, что вы можете найти это с помощью Reflector от redgate.

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

Чтобы получить флаги PE из С#, используйте API System.Reflection: http://www.example8.com/category/view/id/6027

...

Assembly a = Assembly.GetExecutingAssembly();
Module m = a.ManifestModule;

PortableExecutableKinds peKinds;
ImageFileMachine imageFileMachine;
m.GetPEKind(out peKinds, out imageFileMachine);

if ((peKinds & PortableExecutableKinds.ILOnly) != 0)

...