Domanda

Avendo un assembly .NET, come posso rilevare se è stato creato per .NET CF o un framework completo?

È stato utile?

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.

http://ccimetadata.codeplex.com/

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top