Определите, была ли сборка создана для .NET Compact Framework - PullRequest
3 голосов
/ 30 ноября 2009

Имея сборку .NET, как я могу определить, была ли она построена для .NET CF или полной платформы?

Ответы [ 3 ]

2 голосов
/ 30 ноября 2009

Все довольно просто:

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;
    }
}
1 голос
/ 30 ноября 2009

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

http://ccimetadata.codeplex.com/

http://www.mono -project.com / Cecil

1 голос
/ 30 ноября 2009

Лучше всего было бы взять заголовок включаемого файла 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.

Смотрите здесь для более подробной информации.

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

...