Если файл PE содержит код x86, считается ли он сборкой .NET? - PullRequest
3 голосов
/ 15 июля 2011

Я понимаю, что PE-файл .exe может содержать код CLI .Но если он содержит код x86, считается ли он сборкой .NET?

Ответы [ 4 ]

5 голосов
/ 15 июля 2011

Сборка .NET может содержать как IL, так и машинный код. Это так называемые сборки в смешанном режиме, компилятор C ++ / CLI может генерировать их. Несколько сборок .NET являются сборками смешанного режима, хорошими примерами являются System.Data.dll и PresentationCore.dll. Один недостаток - наличие непустого класса <Module> в глобальном пространстве имен. Он может иметь статический конструктор (.cctor), который запускает поддержку C Runtime, необходимую для собственного кода. Еще одна подсказка от утилиты corflags.exe, у которой ILONLY = 0.

4 голосов
/ 15 июля 2011

Исполняемый файл .NET будет иметь другой PE-заголовок (IMAGE_COR20_HEADER), в дополнение к обычным заголовкам, который описывает исполняемый файл как сборку .NET.Найденный там нативный код импортирует mscoree.dll и, в случае исполняемых файлов, перейдет к _CorExeMain для завершения загрузки вашей сборки.

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

1 голос
/ 15 июля 2011

Да, но вы можете или не можете называть это так, в зависимости от того, откуда она взялась.

.NET сборка - это любая библиотека, которая содержит метаданные .NET и требует CLRвыполнить.Например, сборка в смешанном режиме содержит как управляемый, так и неуправляемый код.

Можно получить полностью неуправляемую сборку, если взять управляемую сборку и запустить на ней ngen.Это дает вам сборку «pre-JITted».Однако в этом случае Microsoft могла бы назвать исходную версию IL управляемой сборкой , а после JIT-версии собственный образ управляемой сборки .

* 1015.* Обратите внимание, что в отношении .NET единственное различие между «exe» и «dll» состоит в том, что у одного есть статическая точка входа метода Main, к которой может перейти CLR, а у другого - нет.Оба являются «сборками» с одинаковой базовой внутренней структурой.Так что применяются те же условия.
0 голосов
/ 15 июля 2011

Все .exe в этом контексте содержат код x86, иначе вы не сможете их запустить.Поскольку все .exes имеют код x86, а не все .exes являются сборками .NET, ответ - нет.

Я подозреваю, что вы имеете в виду, если они имеют неуправляемый код?В этом случае ..

Вы можете сделать это, но только имея неуправляемый код в качестве встроенного ресурса. AFAIK: http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx

Невозможно создать сборку .NET с неуправляемым кодом.«просто» в нем: как это будет компилироваться?Какой будет точка входа?Чтобы вызвать неуправляемый код, вы должны объявить DllImport, которому нужно имя .dll - вы не можете ссылаться на свою собственную сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...