Как узнать, содержит ли сборка .NET неуправляемый код? - PullRequest
10 голосов
/ 22 декабря 2009

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

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

Ответы [ 8 ]

9 голосов
/ 22 декабря 2009

Как предлагает 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' говорит о том, что эти флаги не гарантированно верны, поэтому этот метод не может быть надежным.

5 голосов
/ 22 декабря 2009

Запустите PEVerify для вашей сборки.

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

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

3 голосов
/ 22 декабря 2009

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

ildasm file.exe / headers / noil / text

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

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

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

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

1 голос
/ 07 мая 2014

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

  1. Найдите ваш «PEVerify.exe» - он у вас есть, если у вас установлена ​​VS. - Скопируйте полный путь в файл PEVerify.exe, ваш путь будет другим - - Вот пример: C: \ Program Файлы (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ PEVerify.exe

  2. Откройте командную строку Visual Studio (не «Запуск от имени администратора»)

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

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

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

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

0 голосов
/ 13 июля 2013

Чтобы получить флаги PE из C #, используйте 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)

...

0 голосов
/ 22 декабря 2009

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

0 голосов
/ 22 декабря 2009

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

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

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

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

0 голосов
/ 22 декабря 2009

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

...