IL (o Intermediate Language) è il linguaggio che sta a metà fra C# (o VB.NET, Managed C++, J#..) e il .NET Framework.
Ogni programma sviluppato in C# viene convertito in IL, per poter essere eseguito dal framework.

In Java, IL sarebbe il bytecode.

IL non viene mai esplicitato, in quanto nessuno userebbe .NET per programmare Assembler-Style.
Infatti, IL come ASM è un linguaggio di basso livello, solo che invece di interfacciarsi con la macchina, si rivolge al framework.
Ho avuto questo snippet da MONO Framework, il .NET di Ubuntu, infatti neppure su internet si trovano molti esempi in ILAsm.
Approfitto dell'occasione anche per dire, che secondo me, a differenza di quello che si trova in giro per la rete, MONO è perfetto, fatto molto bene.
Questo considerando che non esistono versioni ufficiale di .NET per ambienti Linux, tranne qualche occasione, come openSUSE, dove si trovano porting per .NET grazie agli ultimi accordi fra Microsoft e Novell.

Ma passiamo ai fatti: questo codice dovrebbe stampare a video (Console, ovvio) la scritta "Hello World":

.assembly HelloWorld
{
}

.namespace DefaultNamespace
{
    .class private auto ansi beforefieldinit MainClass
    {
        .method public hidebysig static void Main(string[] args) cil managed
        {
            .entrypoint
            .maxstack  1
            ldstr "Hello World!"
            call void [mscorlib]System.Console::WriteLine(string)
            ret
        }
    }
}


IL è così il linguaggio mistero, infatti non si trovano ne guide, ne esempi, ne riferimenti.
Comunque sia, tutti i file contenenti codice IL hanno estensione *.il
Curiosità: tutti i programmi sviluppati in Visual Studio, basandosi su .NET in ambiente Windows funzionano perfettamente anche su Ubuntu, senza usare WINE, anche se hanno estensione *.exe
Questo, sempre se si ha il MONO Framework installato, un po' come su Windows, dove serve il .NET Framework.

Con questo articolo ne approfitto anche per smontare tutte le persone che accusano .NET di non essere portabile.
Come per Java, .NET necessita di una "Virtual Machine" che interpreta il codice. Il framework originale esiste si solo per Windows, ma come già detto sopra, esistono versioni "Tarocche" per gli altri sistemi, funzionanti, sempre secondo me, molto bene.

Quindi, qual'è la differenza tra Java e .NET in portabilità?
Nessuna, se in tutti i sistemi fosse preinstallato MONO, o nel futuro, una versione di .NET compatibile con tutti i sistemi più famosi.