Определите, была ли сборка создана для .NET Compact Framework
-
08-07-2019 - |
Вопрос
Имея сборку .NET, как я могу определить, была ли она построена для .NET CF или полной платформы?
Решение
Все довольно просто:
public enum AssemblyType
{
CompactFramework,
FullFramework,
NativeBinary
}
public AssemblyType GetAssemblyType(string pathToAssembly)
{
try
{
Assembly asm = Assembly.LoadFrom(pathToAssembly);
var mscorlib = asm.GetReferencedAssemblies().FirstOrDefault(a => string.Compare(a.Name, "mscorlib", true) == 0);
ulong token = BitConverter.ToUInt64(mscorlib.GetPublicKeyToken(), 0);
switch (token)
{
case 0xac22333d05b89d96:
return AssemblyType.CompactFramework;
case 0x89e03419565c7ab7:
return AssemblyType.FullFramework;
default:
throw new NotSupportedException();
}
}
catch (BadImageFormatException)
{
return AssemblyType.NativeBinary;
}
}
Другие советы
Лучше всего было бы взять заголовок включаемого файла C с именем winnt.h, который находится в вашем стандартном VS Professional (обычно это C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include), и оттуда загрузить. EXE в PE-самосвал или использовать Hex Dumper. 1. Посмотрите на заголовок DOS со смещения 0x0. 2. Заголовок NT будет следовать сразу после заголовка DOS. 3. Идентификатор машины - это то, что вы ищете. Идентификатор машины для CF (ARM / MIPS) будет 0x010C / 0x0169 соответственно. Если вы хотите потратить больше времени на осмотр достопримечательностей .. читайте дальше, 4. Затем у вас есть каталог данных, следующий сразу после заголовка NT. Это 15-я запись в каталоге данных, указывающая, является ли .EXE .NET или нет. Если это 0, то это нативный .EXE.
В сочетании вы можете определить, является ли исполняемый файл .NET и для CF.
Смотрите здесь для получения дополнительной информации.
Надеюсь, это поможет, С наилучшими пожеланиями, Том.
Я предпочитаю использовать CCI или Cecil для анализа своих метаданных и проверки, от какого набора ссылок он зависит.