Вопрос

Имея сборку .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 для анализа своих метаданных и проверки, от какого набора ссылок он зависит.

http://ccimetadata.codeplex.com/

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top