La risposta di Sparkie è arrivata, mi permetta di completare un po '.
".NET è multipiattaforma" è un'affermazione troppo ambigua in quanto sia il framework che il mondo per cui è stato originariamente creato sono cambiati e si sono evoluti.
La risposta breve è:
Il motore sottostante che alimenta .NET e i suoi derivati, Common Language Infrastructure Standard, è multipiattaforma e, come se volessi portare il tuo codice su più piattaforme, devi pianificare l'utilizzo delle API giuste sulla piattaforma giusta per offrire la migliore esperienza su ogni piattaforma.
La famiglia CLI non ha provato l'approccio "Scrivi una volta, esegui ovunque", poiché le differenze tra un telefono e un mainframe sono troppo grandi. Invece è emerso un universo di API e funzionalità di runtime che sono specifiche della piattaforma per offrire agli sviluppatori gli strumenti giusti per creare grandi esperienze in ciascuna piattaforma.
Pensaci: i programmatori non prendono più di mira PC Windows o server Unix. Il mondo, ora più che mai, è circondato da affascinanti piattaforme da PC, console di gioco, telefoni potenti, set-top box, grandi server e cluster distribuiti di macchine. Una misura unica su tutta la piattaforma si sentirebbe semplicemente gonfia su piccoli dispositivi e si sentirà sottodimensionata su sistemi di grandi dimensioni .
Il prodotto .NET Framework di Microsoft non è multipiattaforma, funziona solo su Windows. Esistono varianti di .NET Framework di Microsoft che funzionano su altri sistemi come Windows Phone 7, XBox360 e browser tramite Silverlight, ma sono tutti profili leggermente diversi.
Oggi puoi scegliere come target tutti i principali sistemi operativi, telefoni, dispositivi mobili, sistemi e server tradizionali mainstream con tecnologie basate su .NET. Ecco un elenco che mostra l'implementazione della CLI da utilizzare in ciascun caso (questo elenco non è completo, ma dovrebbe coprire il 99% dei casi):
- Computer PC basati su x86 e x86-64:
- con Windows -> In genere esegui .NET o Silverlight, ma puoi anche utilizzare Mono completo qui.
- con Linux, BSD o Solaris -> Si esegue Mono o Silverlight completo
- con MacOS X -> Esegui Mono o Silverlight
- con Android -> Esegui un sottoinsieme Mono / Android
- Computer ARM:
- Esecuzione di Windows Phone 7: esegui Compact Framework 2010
- Esecuzione di Windows 6.5 e versioni precedenti: si esegue il vecchio Compact Framework
- Dispositivi Android: esegui Mono / Android
- Computer PowerPC:
- Esegui Mono completo per sistemi operativi Linux, BSD o Unix completi
- Esegui Mono incorporato per PS3, Wii o altri sistemi integrati.
- Su XBox360, esegui CompactFramework
- Computer S390, S390x, Itanium, SPARC:
- Altri sistemi operativi integrati:
- Esegui .NET MicroFramework o Mono con il profilo mobile.
A seconda delle esigenze, quanto sopra potrebbe essere sufficiente o meno. Difficilmente otterrai lo stesso codice sorgente da eseguire ovunque. Ad esempio, il codice XNA non verrà eseguito su tutti i desktop, mentre il software .NET Desktop non verrà eseguito su XNA o sul telefono. In genere è necessario apportare modifiche al codice per l'esecuzione in altri profili di .NET Framework. Ecco alcuni dei profili di cui sono a conoscenza:
- Profilo .NET 4.0
- Profilo Silverlight
- Profilo di Windows Phone 7
- Profilo XBox360
- Profilo mono core: segue il profilo .NET ed è disponibile su Linux, MacOS X, Solaris, Windows e BSD.
- .NET Micro Framework
- Mono sul profilo iPhone
- Mono su profilo Android
- Mono sul profilo PS3
- Mono sul profilo Wii
- Profilo Moonlight (compatibile con Silverlight)
- Profilo esteso Moonlight (Silverlight + accesso API .NET 4 completo)
Quindi ognuno di quei profili è in realtà leggermente diverso, e questa non è una brutta cosa. Ogni profilo è progettato per adattarsi alla propria piattaforma host ed esporre le API che hanno senso e rimuovere quelle che non hanno senso.
Ad esempio, le API di Silverlight per controllare il browser host non hanno senso sul telefono. E gli shader in XNA non hanno senso sull'hardware del PC a cui manca il supporto equivalente.
Prima ti rendi conto che .NET non è una soluzione per isolare lo sviluppatore dalle capacità sottostanti dell'hardware e della piattaforma nativa, meglio sarai.
Detto questo, alcune API e stack sono disponibili in più piattaforme, ad esempio ASP.NET può essere utilizzato su Windows, Linux, Solaris, MacOS X perché tali API esistono sia su .NET che Mono. ASP.NET non è disponibile su alcune delle piattaforme supportate da Microsoft come XBox o Windows Phone 7 e non è supportato su altre piattaforme supportate da Mono come Wii o iPhone.
Le seguenti informazioni sono corrette solo dal 21 novembre e molte cose nel mondo Mono probabilmente cambieranno.
Gli stessi principi possono essere applicati ad altri stack, un elenco completo richiederebbe una tabella corretta, che non ho idea di come presentare qui, ma ecco un elenco di tecnologie che potrebbero non essere presenti su una particolare piattaforma. Puoi presumere che tutto ciò che non è elencato qui sia disponibile (sentiti libero di inviarmi le modifiche per le cose che ho perso):
Core Runtime Engine [ovunque]
- Supporto Reflection.Emit [ovunque, tranne WP7, CF, Xbox, MonoTouch, PS3]
- Supporto SIMD CPU [Linux, BSD, Solaris, MacOS X; Presto PS3, MonoTouch e MonoDroid]
- Continuazioni - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
- Scaricamento assembly [solo Windows]
- Iniezione di VM [Linux, BSD, MacOS X, Solaris]
- DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
- Generics [alcune limitazioni su PS3 e iPhone].
Le lingue
- C # 4 [ovunque]
- Compilatore C # come servizio (Linux, MacOS, Solaris, BSD, Android)
- IronRuby [ovunque, esegui WP7, CF, Xbox, MonoTouch, PS3]
- IronPython [ovunque, eseguito WP7, CF, Xbox, MonoTouch, PS3]
- F # [ovunque, esegui WP7, CF, Xbox, MonoTouch, PS3]
Stack di server
- ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
- ADO.NET [ovunque]
- LINQ to SQL [ovunque]
- Entity Framework [ovunque]
- Stack XML principale [ovunque]
- Serializzazione XML [ovunque, tranne WP7, CF, Xbox)
- LINQ to XML (ovunque)
- System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
- System.Messaging [Windows; su Linux, MacOS e Solaris richiede RabbitMQ]
- .NET 1 Enterprise Services [solo Windows]
- WCF [completo su Windows; piccolo sottoinsieme su Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
- Flusso di lavoro di Windows [solo Windows]
- Identità spazio carte [solo Windows]
Stack della GUI
- Silverlight (Windows, Mac, Linux - con Moonlight)
- WPF (solo Windows)
- GTK # (Windows, Mac, Linux, BSD)
- Windows.Forms (Windows, Mac, Linux, BSD)
- MonoMac - Integrazione Mac nativa (solo Mac)
- MonoTouch - Integrazione nativa con iPhone (solo iPhone / iPad)
- MonoDroid - Integrazione Android nativa (solo Android)
- API di Media Center: solo Windows
- Clutter (Windows e Linux)
Librerie grafiche
- GDI + (Windows, Linux, BSD, MacOS)
- Al quarzo (MacOS X, iPhone, iPad)
- Il Cairo (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)
Librerie mono: multipiattaforma, possono essere utilizzate in .NET ma richiedono la compilazione manuale
- Compilatore C # 4 come servizio
- Cecil - CIL Manipolazione, flusso di lavoro, strumentazione di CIL, Linker
- Librerie RelaxNG
- Fornitori di database Mono.Data. *
- System.Xaml completo (per l'utilizzo in configurazioni in cui .NET non offre lo stack)
MonoTouch significa Mono in esecuzione su iPhone; MonoDroid significa Mono in esecuzione su Android; Le porte PS3 e Wii sono disponibili solo per sviluppatori qualificati Sony e Nintendo.
Mi scuso per la mancanza di formalità.