Credo invece che la possibilità di eseguire software .NET su piattaforme diverse da Windows sia possibile, anche senza ricompilare il progetto.

"Teoricamente" .NET è multipiattaforma, se consideriamo (com'è evidente che sia) le varie versioni di Windows delle piattaforme differenti. Con i linguaggi di sviluppo tradizionali per Win32, il problema principale del programmatore non è solamente ideare un buon programma, ma anche essere sicuro che il suo software girerà senza intoppi in tutte le incarnazioni di Windows. La cosa è tutt'altro che semplice, in particolar modo in quei progetti leggermente più complicati del classico esempio "Hello World!" che tutti noi per una volta abbiamo letto nei libri e ricopiato nell'IDE. Problemi di versioning delle DLL (DLL hell), difficoltà di registrazione degli oggetti COM, insieme delle API differenti a seconda della versione di Win, il registro di sistema sempre più appesantito, correzioni a vecchi bug che portano più disagi che benefici: questo, e non solo, il panorama tecnico che si prospetta a chi tenta di scrivere applicazioni professionali (compilate) per Windows con uno qualsiasi dei linguaggi disponibili per Win32.

Microsoft, riconosciuti questi difetti, spinta anche (forse) dal dilagare di Java, ha deciso di correre ai ripari progettando un nuovo insieme di API posizionato ad un livello più elevato rispetto a quelle native di Windows, in modo da spianare le differenze tra i vari Windows e dare al programmatore un ambiente di sviluppo coerente e completamente ad oggetti, fortemente convergente alla rete e ad internet.

Similmente a Java, .NET compila i sorgenti in uno speciale codice binario denominato MSIL (Microsoft Intermediate Language), che viene poi interpretato e compilato nel codice macchina dal compilatore JIT (Just In Time) ottimizzandolo per le caratteristiche hardware del pc dove viene eseguito.

Come Java, quindi, una applicazione .NET potrebbe girare su qualunque computer e su qualunque sistema operativo, basta che esista l'apposito framework. Qui si nota come il lavoro di MS si sia fermato (ovviamente) a metà: esiste un framework e un JIT per tutte le versioni di Windows (dal 98 e NT4 in su), ma non si è mai parlato di versioni per altri sistemi operativi (Linux, Mac, Unix etc) e nemmeno si è mai prospettata una simile eventualità.

Il progetto MONO (di Ximian, acquisita recentemente da Novell) tenta di portare .NET anche su Unix e Linux, seguendo la documentazione open che MS ha rilasciato per ottenere le standardizzazione di C# e CLI da parte degli enti ECMA e ISO.

Come ci si evince leggendo le FAQ del sito di Mono ("Q: Can Mono run applications developed with the Microsoft.NET framework? A: Yes, Mono can run applications developed with the Microsoft .NET Framework on Unix. There are a few caveats to keep in mind: Mono has not been completed yet, so a few API calls might be missing; And in some cases the Mono behavior *might* be incorrect."), un compilato MSIL creato con un compilatore MS può girare anche in Unix.

Su questa affermazione sono abbastanza convinto, purchè l'applicazione non utilizzi niente di diverso dalle API standard del framework. Se il programmatore, per migliorare il suo progetto, utilizza chiamate dirette alle API di Windows, il giocattolo si rompe e la compatibilità va a farsi benedire.

Ritornando alla domanda di esposito, sì, è possibile far girare le applicazioni di .NET in Mono, comprese tutte le tecnologie di contorno (ASP.NET, ADO.NET, Windows.Forms etc.), sempre tenendo presente che lo sviluppo di questo "clone" non è ancora terminato (e forse mai lo sarà, visto che MS uscirà prossimamente con .NET 2.0 ...).