2011-01-10 10 views
8

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 ?

+0

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? –

+0

@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

risposta

5

La tua domanda si basa su un malinteso. Ecco l'errore:

di Windows originariamente non sapeva .NET framework

In realtà, a partire da Windows XP, Windows IS aware of the .NET executable format. E XP è stata la prima versione di Windows a supportare 64 bit.

Quindi l'intestazione PE è contrassegnata a 32 bit e la tabella di importazione nativa fa riferimento al numero 3223 mscoree, che su Windows 2000 e versioni precedenti comporta il caricamento di .NET a 32 bit. DllMain per mscoree avvia JIT il codice dell'applicazione e modifica il punto di accesso per l'applicazione principale.

Windows XP e versioni successive, essendo a conoscenza dei metadati .NET, riconosce che è AnyCPU e carica il framework appropriato.

Here's probably more than you ever wanted to know about the process.

Quindi no, non esiste un codice nativo AnyCPU exe. Sebbene sia possibile incorporare un programma DOS a 16 bit in un PE a 32 bit, non è possibile avere un file .exe a 32 bit e 64 bit.

+0

Non è uscito il framework .NET * dopo * il rilascio di XP (almeno, è quello che pensavo di aver ricordato)? Ho pensato [XP è stato rilasciato nel 2001] (http://en.wikipedia.org/wiki/Windows_xp) e [.NET nel 2002] (http://en.wikipedia.org/wiki/.NET_Framework) .. – Mehrdad

+0

@Lambert: i periodi di sviluppo si sono sovrapposti, lo sviluppo .NET è iniziato circa 5 anni prima del rilascio iniziale nel 2002, quindi Microsoft ha tutto il tempo per inserire gli hook in XP. E come ho detto, Windows 2000 è solo a 32 bit. Ad ogni modo, è la data di rilascio dell'edizione di Windows XP 64 bit, molti anni dopo, che dovresti prendere in considerazione, dal momento che è la prima versione che aveva bisogno di questa "magia". –

+0

Ah ... questo lo spiega. (E sì, mi spiace di aver rimosso la parte di Windows 2000 riguardo al mio commento poco prima di pubblicare, dal momento che mi sono ricordato che non aveva 64 bit.) Non la risposta che stavo cercando, ma sicuramente sembra corretta; Grazie! :) – Mehrdad

4

In realtà, è possibile avere un codice x64 in un eseguibile x86 se il sistema ha un livello di emulazione WOW64 (Windows Vista +, non so su XP). http://vxheavens.com/lib/vrg02.html

Ho provato questa tecnica e funziona su Win7 e WinVista. Ho scritto un piccolo stub in assembly per risolvere le importazioni e caricare un codice C che è stato compilato per AMD64.

Microsoft dice solo che non è possibile eseguire il passaggio avanti e indietro perché potrebbero cambiarlo, ma dubito che questo cambierà fino a quando l'architettura sottostante non cambia per consentire anche l'esecuzione di qualcosa come 128 bit ... a quel punto dubito WOW64 sarà intorno a :), WOW128 ftl.

+1

+1 OMG è fantastico! : D grazie per averlo condiviso! – Mehrdad

Problemi correlati