La respuesta de Sparkie lo consiguió, déjame complementar un poco.
".NET es multiplataforma" es una declaración demasiado ambigua, ya que tanto el marco como el mundo para el que se creó originalmente han cambiado y evolucionado.
La respuesta corta es:
El motor subyacente que impulsa .NET y sus derivados, el Common Language Infrastructure Standard, es multiplataforma y, como si quisiera que su código vaya a múltiples plataformas, debe planear el uso de las API correctas en la plataforma correcta para entregar La mejor experiencia en cada plataforma.
La familia CLI no ha probado el enfoque "Escribir una vez, ejecutar en cualquier lugar", ya que las diferencias entre un teléfono y una unidad central son demasiado grandes. En cambio, ha surgido un universo de características de API y tiempo de ejecución que son específicas de la plataforma para brindar a los desarrolladores las herramientas adecuadas para crear grandes experiencias en cada plataforma.
Piénselo: los programadores ya no se dirigen a PC con Windows o servidores Unix. El mundo, ahora más que nunca, está rodeado de plataformas fascinantes, desde PC hasta consolas de juegos, teléfonos potentes, decodificadores, grandes servidores y grupos distribuidos de máquinas. Un ajuste único en todas las plataformas simplemente se sentiría hinchado en dispositivos pequeños y se sentiría con poca potencia en sistemas grandes .
El producto .NET Framework de Microsoft no es multiplataforma, solo se ejecuta en Windows. Existen variaciones de .NET Framework de Microsoft que se ejecutan en otros sistemas como Windows Phone 7, XBox360 y navegadores a través de Silverlight, pero todos son perfiles ligeramente diferentes.
Hoy puede dirigirse a todos los principales sistemas operativos, teléfonos, dispositivos móviles, sistemas integrados y servidores con tecnologías basadas en .NET. Aquí hay una lista que muestra qué implementación de CLI usaría en cada caso (esta lista no es exhaustiva, pero debería cubrir el 99% de los casos):
- Computadoras PC basadas en x86 y x86-64:
- ejecutando Windows -> Normalmente ejecuta .NET o Silverlight pero también puede usar Mono completo aquí.
- ejecutando Linux, BSD o Solaris -> Ejecutas Mono o Silverlight completo
- ejecutando MacOS X -> Ejecutas Full Mono o Silverlight
- ejecutando Android -> Ejecutas el subconjunto Mono / Android
- Computadoras ARM:
- Ejecutando Windows Phone 7: ejecuta Compact Framework 2010
- Ejecutando Windows 6.5 y versiones anteriores: ejecutas el antiguo Compact Framework
- Dispositivos Android: ejecutas Mono / Android
- Computadoras PowerPC:
- Usted ejecuta Mono completo para sistemas operativos Linux, BSD o Unix completos
- Ejecutas Mono integrado para PS3, Wii u otros sistemas integrados.
- En XBox360, ejecuta CompactFramework
- Computadoras S390, S390x, Itanium, SPARC:
- Otros sistemas operativos integrados:
- Ejecutas .NET MicroFramework o Mono con el perfil móvil.
Dependiendo de sus necesidades, lo anterior puede ser suficiente o no. Difícilmente obtendrá el mismo código fuente para ejecutar en todas partes. Por ejemplo, el código XNA no se ejecutará en todos los escritorios, mientras que el software .NET Desktop no se ejecutará en XNA o en el teléfono. Por lo general, debe realizar cambios en su código para ejecutarse en otros perfiles de .NET Framework. Estos son algunos de los perfiles que conozco:
- Perfil .NET 4.0
- Perfil de Silverlight
- Perfil de Windows Phone 7
- Perfil XBox360
- Perfil mono núcleo: sigue el perfil .NET y está disponible en Linux, MacOS X, Solaris, Windows y BSD.
- .NET Micro Framework
- Mono en el perfil de iPhone
- Mono en el perfil de Android
- Mono en el perfil de PS3
- Mono en el perfil de Wii
- Perfil de luz de luna (compatible con Silverlight)
- Perfil extendido Moonlight (Silverlight + acceso completo a .NET 4 API)
Entonces, cada uno de esos perfiles es en realidad un poco diferente, y esto no es algo malo. Cada perfil está diseñado para adaptarse a su plataforma de host y exponer las API que tienen sentido y eliminar las que no tienen sentido.
Por ejemplo, las API de Silverlight para controlar el navegador host no tienen sentido en el teléfono. Y los sombreadores en XNA no tienen sentido en el hardware de PC que carece del soporte equivalente para él.
Cuanto antes se dé cuenta de que .NET no es una solución para aislar al desarrollador de las capacidades subyacentes del hardware y la plataforma nativa, mejor estará.
Dicho esto, algunas API y pilas están disponibles en varias plataformas, por ejemplo, ASP.NET se puede usar en Windows, Linux, Solaris y MacOS X porque esas API existen tanto en .NET como en Mono. ASP.NET no está disponible en algunas de las plataformas compatibles de Microsoft como XBox o Windows Phone 7 y tampoco es compatible con otras plataformas que Mono admite como Wii o iPhone.
La siguiente información solo es correcta a partir del 21 de noviembre, y muchas cosas en el mundo Mono probablemente cambiarán.
Los mismos principios se pueden aplicar a otras pilas, una lista completa requeriría una tabla adecuada, que no tengo idea de cómo presentar aquí, pero aquí hay una lista de tecnologías que podrían no estar presentes en una plataforma en particular. Puede suponer que cualquier cosa que no esté en la lista aquí está disponible (no dude en enviarme ediciones para las cosas que me perdí)
Core Runtime Engine [en todas partes]
- Reflection.Emit Support [en todas partes, excepto WP7, CF, Xbox, MonoTouch, PS3]
- Compatibilidad con CPU SIMD [Linux, BSD, Solaris, MacOS X; Pronto PS3, MonoTouch y MonoDroid]
- Continuaciones - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
- Descarga de ensamblaje [solo Windows]
- Inyección de VM [Linux, BSD, MacOS X, Solaris]
- DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
- Genéricos [algunas limitaciones en PS3 y iPhone].
Idiomas
- C # 4 [en todas partes]
- Compilador de C # como servicio (Linux, MacOS, Solaris, BSD, Android)
- IronRuby [en todas partes, excepto WP7, CF, Xbox, MonoTouch, PS3]
- IronPython [en todas partes, exec WP7, CF, Xbox, MonoTouch, PS3]
- F # [en todas partes, excepto WP7, CF, Xbox, MonoTouch, PS3]
Pilas de servidor
- ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
- ADO.NET [en todas partes]
- LINQ to SQL [en todas partes]
- Entity Framework [en todas partes]
- Pila XML principal [en todas partes]
- Serialización XML [en todas partes, excepto WP7, CF, Xbox)
- LINQ to XML (en todas partes)
- System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
- System.Messaging [Windows; en Linux, MacOS y Solaris requiere RabbitMQ]
- .NET 1 Enterprise Services [solo Windows]
- WCF [completo en Windows; pequeño subconjunto en Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
- Flujo de trabajo de Windows [solo Windows]
- Identidad de espacio de tarjeta [solo Windows]
Pilas GUI
- Silverlight (Windows, Mac, Linux - con Moonlight)
- WPF (solo Windows)
- Gtk # (Windows, Mac, Linux, BSD)
- Windows.Forms (Windows, Mac, Linux, BSD)
- MonoMac - Integración nativa de Mac (solo Mac)
- MonoTouch - Integración nativa de iPhone (solo iPhone / iPad)
- MonoDroid - Integración nativa de Android (solo Android)
- API de Media Center: solo Windows
- Desorden (Windows y Linux)
Bibliotecas Gráficas
- GDI + (Windows, Linux, BSD, MacOS)
- Cuarzo (MacOS X, iPhone, iPad)
- El Cairo (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)
Bibliotecas mono: multiplataforma, se pueden usar en .NET pero requieren una creación manual
- Compilador C # 4 como servicio
- Cecil - CIL Manipulación, flujo de trabajo, instrumentación de CIL, Linkers
- Bibliotecas RelaxNG
- Proveedores de bases de datos Mono.Data. *
- System.Xaml completo (para usar en configuraciones donde .NET no ofrece la pila)
MonoTouch significa Mono ejecutándose en iPhone; MonoDroid significa Mono ejecutándose en Android; Los puertos PS3 y Wii solo están disponibles para los desarrolladores calificados de Sony y Nintendo.
Pido disculpas por la falta de formalidad.