Ответ 1
Вы можете проверить информацию заголовка PE для информации о том, какая информация содержится в DLL. Эта статья описывает, как это сделать подробно.
Я держу перед собой DLL. Используя только Win32 SDK, можете ли вы сказать мне, является ли эта DLL сборкой .NET?
Почему? Наше приложение загружает плагины в виде DLL. Мы пытаемся расширить определение этих плагинов, чтобы позволить сборкам .NET, но интерфейс будет другим, и, следовательно, загрузчик должен будет знать, управляется ли DLL или неуправляемым до его загрузки.
Вы можете проверить информацию заголовка PE для информации о том, какая информация содержится в DLL. Эта статья описывает, как это сделать подробно.
Чтобы определить, управляется или неуправляем DLL (или EXE), используйте dumpbin.exe
с помощью переключателя /dependents
. Если вы видите mscoree.dll
в результатах, то сборка является управляемой сборкой.
Например, для управляемой DLL, созданной в Visual Studio 2010, я получаю следующий вывод:
Dump of file <MANAGED_DLL>.dll
File Type: DLL
Image has the following dependencies:
mscoree.dll
Summary
2000 .reloc
2000 .rsrc
2000 .sdata
12000 .text
dumpbin.exe
поставляется как часть Инструменты Visual Studio. Чтобы запустить его, удобный способ сделать это через Командная строка Visual Studio. Например, с моей машины Windows 7, работающей с Visual Studio 2010, я нашел командную строку Visual Studio в меню "Пуск" Windows по адресу:
Microsoft Visual Studio 2010 = > Инструменты Visual Studio = > Командная строка Visual Studio (2010)
Затем в командной строке Visual Studio просто введите:
dumpbin /dependents DLL_OF_INTEREST.DLL
или
dumpbin /dependents EXE_OF_INTEREST.EXE
В качестве альтернативы вы можете использовать утилиту corflags.exe
, которая также включена в Visual Studio Tools. Запуск из командной строки Visual Studio в неуправляемой сборке:
corflags UNMANAGED.DLL
.. вы получите:
corflags : error CF008 : The specified file does not have a valid managed header
... тогда как на управляемой сборке вы получите что-то вроде:
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 1
ILONLY : 1
32BIT : 0
Signed : 0
Связанный:
Я бы просто попытался загрузить его как сборку .NET, и если он не сработает, вернитесь к "неуправляемому" интерфейсу.