A resposta de Sparkie entendeu, deixe-me complementar um pouco.
".NET é multiplataforma" é uma declaração ambígua demais, pois a estrutura e o mundo para o qual foi originalmente criada mudaram e evoluíram.
A resposta curta é:
O mecanismo subjacente que alimenta o .NET e seus derivados, o Common Language Infrastructure Standard, é multiplataforma e, como se você deseja que seu código vá para várias plataformas, é necessário planejar o uso das APIs certas na plataforma certa para fornecer a melhor experiência em cada plataforma.
A família CLI não tentou a abordagem "Write Once, Run Anywhere", pois as diferenças de um telefone para um mainframe são muito grandes. Em vez disso, surgiu um universo de recursos de API e tempo de execução específicos da plataforma para fornecer aos desenvolvedores as ferramentas certas para criar ótimas experiências em cada plataforma.
Pense bem: os programadores não têm mais como alvo PCs Windows ou Servidores Unix. Agora, mais do que nunca, o mundo está cercado por plataformas fascinantes de PCs, consoles de jogos, telefones poderosos, decodificadores, grandes servidores e aglomerados de máquinas distribuídos. Um tamanho único em todas as plataformas se sentiria inchado em dispositivos minúsculos e com pouca potência em sistemas grandes .
O produto .NET Framework da Microsoft não é multiplataforma, é executado apenas no Windows. Existem variações do .NET Framework da Microsoft que são executadas em outros sistemas como o Windows Phone 7, o XBox360 e navegadores através do Silverlight, mas todos são perfis ligeiramente diferentes.
Hoje você pode segmentar todos os principais sistemas operacionais, telefones, dispositivos móveis, sistemas e servidores incorporados com as tecnologias baseadas em .NET. Aqui está uma lista que mostra qual implementação de CLI você usaria em cada caso (esta lista não é abrangente, mas deve cobrir 99% dos casos):
- Computadores PC baseados em x86 e x86-64:
- executando Windows -> Normalmente, você executa o .NET ou o Silverlight, mas também pode usar o Mono completo aqui.
- executando Linux, BSD ou Solaris -> Você executa o Mono ou Silverlight completo
- executando o MacOS X -> Você executa o Mono ou o Silverlight completo
- executando Android -> Você executa o subconjunto Mono / Android
- Computadores ARM:
- Executando o Windows Phone 7: você executa o Compact Framework 2010
- Executando o Windows 6.5 e anterior: você executa o antigo Compact Framework
- Dispositivos Android: você executa Mono / Android
- Computadores PowerPC:
- Você executa o Mono completo para sistemas operacionais Linux, BSD ou Unix completos
- Você roda o Mono incorporado para PS3, Wii ou outros sistemas embarcados.
- No XBox360, você executa o CompactFramework
- Computadores S390, S390x, Itanium, SPARC:
- Você executa Mono completo
- Outros sistemas operacionais incorporados:
- Você executa o .NET MicroFramework ou Mono com o perfil móvel.
Dependendo das suas necessidades, as opções acima podem ser suficientes ou não. Você dificilmente conseguirá o mesmo código fonte para rodar em qualquer lugar. Por exemplo, o código XNA não será executado em todas as áreas de trabalho, enquanto o software .NET Desktop não será executado no XNA ou no telefone. Você normalmente precisa fazer alterações no seu código para executar em outros perfis do .NET Framework. Aqui estão alguns dos perfis que eu conheço:
- Perfil do .NET 4.0
- Perfil do Silverlight
- Perfil do Windows Phone 7
- Perfil do XBox360
- Perfil mono core - segue o perfil .NET e está disponível no Linux, MacOS X, Solaris, Windows e BSD.
- .NET Micro Framework
- Mono no perfil do iPhone
- Mono no perfil do Android
- Mono no perfil PS3
- Mono no perfil do Wii
- Perfil Moonlight (compatível com Silverlight)
- Perfil estendido Moonlight (Silverlight + acesso completo à API .NET 4)
Portanto, cada um desses perfis é realmente um pouco diferente, e isso não é uma coisa ruim. Cada perfil é projetado para caber em sua plataforma host e expor as APIs que fazem sentido e remover as que não fazem sentido.
Por exemplo, as APIs do Silverlight para controlar o navegador host não fazem sentido no telefone. E os shaders no XNA não fazem sentido no hardware de PC que não possui o suporte equivalente.
Quanto mais cedo você perceber que o .NET não é uma solução para isolar o desenvolvedor dos recursos subjacentes do hardware e da plataforma nativa, melhor será.
Dito isso, algumas APIs e pilhas estão disponíveis em várias plataformas, por exemplo, o ASP.NET pode ser usado no Windows, no Linux, no Solaris, no MacOS X porque essas APIs existem no .NET e no Mono. O ASP.NET não está disponível em algumas plataformas suportadas pela Microsoft, como XBox ou Windows Phone 7, nem em outras plataformas suportadas pelo Mono, como o Wii ou o iPhone.
As informações a seguir estão corretas somente a partir de 21 de novembro, e muitas coisas no mundo Mono provavelmente mudarão.
Os mesmos princípios podem ser aplicados a outras pilhas; uma lista completa exigiria uma tabela adequada, que não tenho idéia de como apresentar aqui, mas aqui está uma lista de tecnologias que podem não estar presentes em uma plataforma específica. Você pode supor que qualquer coisa não listada aqui esteja disponível (sinta-se à vontade para me enviar edições pelas coisas que perdi):
Mecanismo de tempo de execução principal [em todos os lugares]
- Suporte Reflection.Emit [em todos os lugares, exceto WP7, CF, Xbox, MonoTouch, PS3]
- Suporte para CPU SIMD [Linux, BSD, Solaris, MacOS X; Em breve PS3, MonoTouch e MonoDroid]
- Continuações - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
- Descarregamento de montagem [somente Windows]
- Injeção de VM [Linux, BSD, MacOS X, Solaris]
- DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
- Genéricos [algumas limitações no PS3 e iPhone].
línguas
- C # 4 [em todos os lugares]
- Compilador C # como serviço (Linux, MacOS, Solaris, BSD, Android)
- IronRuby [em todos os lugares, executivo WP7, CF, Xbox, MonoTouch, PS3]
- IronPython [em todos os lugares, WP7, CF, Xbox, MonoTouch, PS3]
- F # [em todos os lugares, WP7, CF, Xbox, MonoTouch, PS3]
Pilhas de servidor
- ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
- ADO.NET [em todos os lugares]
- LINQ to SQL [em todos os lugares]
- Estrutura de entidades [em todos os lugares]
- Pilha XML principal [em todos os lugares]
- Serialização XML [em todos os lugares, exceto WP7, CF, Xbox)
- LINQ to XML (em qualquer lugar)
- System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
- System.Messaging [Windows; no Linux, MacOS e Solaris requer RabbitMQ]
- .NET 1 Enterprise Services [somente Windows]
- WCF [completo no Windows; pequeno subconjunto no Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
- Fluxo de trabalho do Windows [somente Windows]
- Identidade do espaço do cartão [somente Windows]
Pilhas da GUI
- Silverlight (Windows, Mac, Linux - com Moonlight)
- WPF (somente Windows)
- Gtk # (Windows, Mac, Linux, BSD)
- Windows.Forms (Windows, Mac, Linux, BSD)
- MonoMac - Integração nativa com Mac (somente Mac)
- MonoTouch - Integração nativa do iPhone (somente iPhone / iPad)
- MonoDroid - Integração nativa com Android (apenas Android)
- APIs do Media Center - apenas Windows
- Desorganização (Windows e Linux)
Bibliotecas Gráficas
- GDI + (Windows, Linux, BSD, MacOS)
- Quartzo (MacOS X, iPhone, iPad)
- Cairo (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)
Bibliotecas Mono - Plataforma cruzada, podem ser usadas no .NET, mas exigem a criação manual
- Compilador C # 4 como um serviço
- Cecil - CIL Manipulação, fluxo de trabalho, instrumentação de CIL, Linkers
- Bibliotecas RelaxNG
- Provedores de banco de dados Mono.Data. *
- System.Xaml completo (para uso em configurações nas quais o .NET não oferece a pilha)
MonoTouch significa Mono em execução no iPhone; MonoDroid significa Mono rodando no Android; As portas PS3 e Wii estão disponíveis apenas para desenvolvedores qualificados da Sony e Nintendo.
Peço desculpas pela falta de formalidade.