Mi ha sconcertato come funziona la funzione "AnyCPU" in .NET: carica l'eseguibile come nativo 32 -bit se il sistema è a 32 bit e a 64 bit se il sistema è a 64 bit (che puoi facilmente confermare con Task Manager). Quindi, ovviamente, questo non è impossibile.Scrittura di un multipiattaforma (a 32 bit e 64 bit compatibile) Programma per Windows (come AnyCPU in .NET)
La domanda è: in che modo Microsoft ha fatto questo? Originariamente, Windows non conosceva il framework .NET, quindi il caricatore di Windows PE non è in grado di cercare funzionalità extra nelle intestazioni PE per l'intestazione CLR; questa funzione deve essere stata aggiunta da una sorta di estensione in modalità kernel. Ma il framework .NET sembra non installare nulla del genere ... Sono completamente a corto di come lo stesso eseguibile possa essere nativo a 32-bit e 64-bit allo stesso tempo, soprattutto dal momento che uno smontaggio di mscoree.dll non lo fa 'anche mostrare riferimenti a funzioni native non documentate.
Qualcuno ha qualche conoscenza e/o ipotesi ragionevoli su come è stato fatto? E 'ovviamente possibile (quindi niente dicendo cose come "non è possibile"), e mi fa venir voglia di provare a scrivere un nativo EXE cross-platform ...
Modifica:
Come una nota a margine, considera come non è possibile eseguire eseguibili a 32 bit in un ambiente Windows PE a 64 bit ... c'è ottenuto come modo per estendere o modificare il caricatore PE con una sorta di "plug-in", a destra ?
Esistono alcuni programmi (ad esempio Process Explores) che eseguono la distribuzione di un file eseguibile a 32 bit che * avvia * un'immagine a 64 bit, se possibile. Per esempio. è un eseguibile "AnyCPU" mai qualcosa ma un PE a 32 bit? –
@pst: ne sono completamente consapevole, ma no, sono diversi. Gli eseguibili AnyCPU sono a 64 bit dal momento in cui vengono avviati su sistemi operativi a 64 bit - non c'è decompressione e non c'è niente come "Let's JIT questo codice bytecode a 64-bit e quindi riavviare il processo a 64 bit". Questo è ciò che mi lascia sconcertato. – Mehrdad