Detectar se o conjunto foi construído para Compact Framework
-
08-07-2019 - |
Pergunta
Ter um .NET assembly, como posso detectar se ele foi construído para .NET CF ou um quadro completo?
Solução
É muito simples:
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;
}
}
Outras dicas
A melhor aposta seria para pegar os do C incluem cabeçalho do arquivo chamado winnt.h, encontrada em seu padrão VS Professional (geralmente C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include) e de lá, carregue o. EXE em um Dumper PE de algum tipo, ou usar um Hex Dumper. 1. Veja o cabeçalho DOS a partir de 0x0 offset. 2. O cabeçalho NT imediatamente seguir após o cabeçalho DOS. 3. The Machine ID é o que você está procurando. O ID de máquina para a fibrose cística (ARM / MIPS) seria 0x010C / 0x0169, respectivamente. Se você deseja investir mais tempo em bisbilhotando .. ler, 4. Então você tem o diretório de dados imediatamente após após NT cabeçalho. É a entrada de diretório de dados 15 é a indicação de se o .exe é .NET ou não. Se for 0, então é um .EXE nativa.
Combinadas então você pode dizer se o executável é .NET e para o CF.
aqui para mais detalhes.
Espero que isso ajude, Cumprimentos, Tom.
Eu prefiro usar CCI ou Cecil para analisar seus metadados e confira qual o conjunto de referências que depende.