2013-07-17 7 views
6

Sto solo cercando di ottenere una migliore comprensione di ciò che accade in un semplice scenario in cui viene aggiunto il seguente codice in un file e salvato con l'estensione .cs:Il file .exe prodotto dal compilatore C# è costituito esclusivamente da Common Intermediate Language (CIL)?

public class HelloWorld 
{ 
    public static void Main() 
    { 
    System.Console.WriteLine("Hello World!"); 
    System.Console.ReadLine(); 
    } 
} 

e poi questo programma viene eseguito presso il riga di comando di Windows con:

C:\Windows\Microsoft.NET\Framework\v4.0.30319>csc /t:exe /out:C:\HelloWorld\HelloWorld.exe C:\HelloWorld\HelloWorld.cs 

posso vedere questo processo produce un file exe, tuttavia quando la lettura circa la compile process on wikipedia afferma:

  1. Il codice sorgente viene convertito in Common Intermediate Language (CIL), che è l'equivalente della CLI del linguaggio Assembly per una CPU.
  2. CIL viene quindi assemblato in un modulo di cosiddetto bytecode e viene creato un assembly CLI.
  3. Dopo l'esecuzione di un assembly CLI, il suo codice viene passato al compilatore JIT del runtime per generare codice nativo ...
  4. Il codice nativo viene eseguito dal processore del computer.

Così fa il file exe in sé consiste solo di Common Intermediate Lanaguage? Ed è questo stesso file ciò che l'articolo di wikipedia definisce "assemblaggio CLI"? Sono un po 'confuso perché posso vedere solo il file .exe e per me il termine' assembly 'contiene più di un file.

E RELATIVA domanda:

  • è il compilatore JIT da qualche parte nella directory Microsoft.NET e su eseguendo il file exe il file comunica con il compilatore JIT che poi emette le istruzioni in codice nativo?

risposta

11

No, non è così.

L'eseguibile è un PE image.

Vedere Anatomy of a .NET Assembly – PE Headers per dettagli.

assembly .NET sono costruiti sulla parte superiore del formato PE (Portable Executable) file che viene utilizzato per tutti i file eseguibili e le DLL di Windows, che si è costruito in cima al formato di file eseguibile MSDOS. La ragione di ciò è che quando .NET 1 è stato rilasciato, non era una parte del sistema operativo integrata come al giorno d'oggi. Prima di Windows XP, gli eseguibili .NET dovevano caricare come qualsiasi altro eseguibile, dovevano eseguire codice nativo per avviare il CLR per leggere & eseguire il resto del file.

1

Si chiama assemblaggio, perché contiene più di un semantica dati:

  • codice
  • manifesto
  • 0 o più moduli

Se sul qualsiasi CLR assembly (EXE o DLL) si esegue uno strumento semplice come: DotPeek vedrete le istruzioni IL.

+0

Penso che il tuo terzo punto dovrebbe essere '1 o più moduli', se non ci sono moduli allora non c'è nessun posto dove mettere il manifest. È anche interessante notare che un assembly può estendersi su più file e un modulo senza manifest può appartenere a più assiemi. –

Problemi correlati