Rileva se l'assembly è stato creato per .NET Compact Framework
-
08-07-2019 - |
Domanda
Avendo un assembly .NET, come posso rilevare se è stato creato per .NET CF o un framework completo?
Soluzione
È abbastanza semplice:
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;
}
}
Altri suggerimenti
La soluzione migliore sarebbe quella di prendere l'intestazione del file include C chiamato winnt.h, che si trova nel tuo VS Professional standard (di solito C: \ Programmi \ Microsoft Visual Studio 9.0 \ VC \ include) e da lì caricare il file. EXE in un dumper PE di qualche tipo o usa un dumper esadecimale. 1. Guarda DOS HEader dall'offset 0x0. 2. L'intestazione NT seguirà immediatamente dopo l'intestazione DOS. 3. L'ID macchina è ciò che stai cercando. L'ID macchina per CF (ARM / MIPS) sarebbe 0x010C / 0x0169, rispettivamente. Se desideri investire più tempo a curiosare .. continua a leggere, 4. Quindi hai la directory Data che segue immediatamente dopo Intestazione NT. È la 15a voce della directory dei dati a indicare se .EXE è .NET o meno. Se è 0, allora è un .EXE nativo.
Combinati insieme è quindi possibile stabilire se l'eseguibile è .NET e per la CF.
Guarda qui per maggiori dettagli.
Spero che questo aiuti, I migliori saluti, Tom.
Preferisco usare CCI o Cecil per analizzare i suoi metadati e verificare da quale serie di riferimenti dipende.