2009-11-29 2 views
3

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

+1

откуда, на рабочем столе устройства? И вы имеете в виду от кода или от инструмента, такого как Reflector? – ctacke

+0

С рабочего стола, от кода. –

ответ

2

Это довольно просто:

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; 
    } 
} 
+0

Спасибо. Я подумал об этом решении, но меня беспокоило, являются ли открытые ключи одинаковыми для всех версий CF. Но, зная ваши знания о CF, я предполагаю, что они есть, поэтому я буду использовать это. –

+0

Все они одинаковые. Мы используем аналогичные методы в коде для дизайнера управления. Если мы создаем против всего ключевого фреймворка, мы знаем, что во время разработки (или создаем его на рабочем столе). – ctacke

1

Лучшая ставка будет заключаться в том, чтобы захватить заголовок файла с именем winnt.h, который находится в стандартном VS Professional (обычно C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include), и оттуда загружать .EXE в какой-то PE-самосвал или использовать Hex Dumper. 1. Посмотрите на DOS HEader со смещения 0x0. 2. Заголовок NT сразу же после заголовка DOS. 3. Идентификатор машины - это то, что вы ищете. Идентификатор машины для CF (ARM/MIPS) будет равен 0x010C/0x0169, соответственно. Если вы хотите потратить больше времени на то, чтобы засунуть ... читать дальше, 4. Затем у вас есть каталог данных, следующий за заголовком NT. Это 15-я запись каталога данных - это указание того, является ли .EXE .NET или нет. Если это 0, то это родной .EXE.

В сочетании вы можете узнать, является ли исполняемый файл .NET и для CF.

Для получения более подробной информации смотрите here.

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

+0

Я проверил две библиотеки .NET, созданные для CF, и оба имеют идентификатор машины, установленный в 0x014C (IMAGE_FILE_MACHINE_I386). Я полагаю, что это связано с тем, что файлы .NET на самом деле не специфичны для устройства - нет смысла писать «ARM», когда они могут прозрачно поддерживать MIPS/SH3/x86/etc. –

+0

@ Андрей Андреевич Щекин: Это интересно, так как кажется, что VS Pro создаст exe, нацеливающую CF (arm/mips/sh3), и все же поставьте идентификатор машины на 386. Будет ли это ошибка? Спасибо за интересный ответ, это меня удивило, потому что я не думал, что это произойдет! :) – t0mm13b

+0

Я не думаю, что это ошибка, так как файлы .NET CF exe работают на x86/x64, если они не используют API-интерфейсы, специфичные для устройства. –

1

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

http://ccimetadata.codeplex.com/

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

+0

На мой вопрос есть тег mono.cecil, с определенной целью. :) Но что я должен искать? Сборка Я просмотрел ссылки mscorlib и System.dll. Должен ли я проверить некоторые номера версий? Являются ли они определенными различиями между .NET и .NET CF? –

+0

номер версии может быть важным показателем, http://en.wikipedia.org/wiki/.NET_Compact_Framework http://en.wikipedia.org/wiki/.NET_Framework –

Смежные вопросы