Ответ Спарки получил, позвольте мне немного дополнить.
«.NET - это кроссплатформенность» - слишком неоднозначное утверждение, так как среда и среда, для которой он был изначально создан, изменились и эволюционировали.
Краткий ответ:
Базовый механизм, обеспечивающий работу .NET и его производных, Common Language Infrastructure Standard, является кроссплатформенным, и, если вы хотите, чтобы ваш код работал на нескольких платформах, вам нужно планировать использование правильных API на правильной платформе для предоставления лучший опыт на каждой платформе.
Семейство CLI не пробовало подход «напиши один раз, запусти везде», поскольку различия между телефоном и мэйнфреймом слишком велики. Вместо этого появился целый ряд API и функций времени выполнения, которые зависят от платформы, чтобы предоставить разработчикам нужные инструменты для создания отличных впечатлений на каждой платформе.
Подумайте об этом: программисты больше не ориентированы на ПК с Windows или Unix-серверы. Сейчас мир, как никогда ранее, окружен увлекательными платформами от ПК, игровых консолей, мощных телефонов, телевизионных приставок, больших серверов и распределенных кластеров машин. Один размер, подходящий для всех платформ, будет просто ощущаться раздутым на крошечных устройствах и ощущаться слабым в больших системах .
Продукт Microsoft .NET Framework не является кроссплатформенным, он работает только в Windows. Существуют варианты .NET Framework от Microsoft, которые работают в других системах, таких как Windows Phone 7, XBox360 и браузеры через Silverlight, но все они имеют несколько разные профили.
Сегодня вы можете использовать любую основную операционную систему, телефон, мобильное устройство, встроенную систему и сервер с помощью технологий на основе .NET. Вот список, который показывает, какую реализацию CLI вы бы использовали в каждом случае (этот список не является исчерпывающим, но должен охватывать 99% случаев):
- ПК на базе x86 и x86-64:
- под управлением Windows -> Обычно вы запускаете .NET или Silverlight, но вы также можете использовать полный Mono здесь.
- под управлением Linux, BSD или Solaris -> вы используете полный Mono или Silverlight
- под управлением MacOS X -> Вы запускаете полный Mono или Silverlight
- под управлением Android -> Вы запускаете Mono / Android subset
- ARM компьютеры:
- Запуск Windows Phone 7: вы запускаете Compact Framework 2010
- Запуск Windows 6.5 и старше: вы используете старую Compact Framework
- Устройства Android: вы запускаете Mono / Android
- Компьютеры PowerPC:
- Вы запускаете полную версию Mono для полной операционной системы Linux, BSD или Unix
- Вы запускаете встроенный Mono для PS3, Wii или других встроенных систем.
- На XBox360 вы запускаете CompactFramework
- Компьютеры S390, S390x, Itanium, SPARC:
- Другие встроенные операционные системы:
- Вы запускаете .NET MicroFramework или Mono с мобильным профилем.
В зависимости от ваших потребностей выше может быть достаточно или нет. Вы вряд ли получите один и тот же исходный код для запуска везде. Например, код XNA не будет работать на каждом рабочем столе, в то время как программное обеспечение .NET Desktop не будет работать на XNA или телефоне. Обычно вам нужно внести изменения в свой код для запуска в других профилях .NET Framework. Вот некоторые из известных мне профилей:
- Профиль .NET 4.0
- Профиль Silverlight
- Профиль Windows Phone 7
- Профиль XBox360
- Профиль ядра Mono - соответствует профилю .NET и доступен в Linux, MacOS X, Solaris, Windows и BSD.
- .NET Micro Framework
- Mono в профиле iPhone
- Mono в профиле Android
- Моно на профиле PS3
- Mono на профиле Wii
- Профиль Moonlight (совместим с Silverlight)
- Расширенный профиль Moonlight (Silverlight + полный доступ к API .NET 4)
Так что каждый из этих профилей на самом деле немного отличается, и это неплохо. Каждый профиль предназначен для размещения на его хост-платформе и предоставляет API-интерфейсы, которые имеют смысл, и удаляет те, которые не имеют смысла.
Например, API-интерфейсы Silverlight для управления браузером хоста не имеют смысла на телефоне. И шейдеры в XNA не имеют смысла на оборудовании ПК, в котором отсутствует эквивалентная поддержка.
Чем раньше вы поймете, что .NET не является решением для изоляции разработчика от базовых возможностей аппаратного обеспечения и родной платформы, тем лучше вы будете.
Начнем с того, что некоторые API и стеки доступны на нескольких платформах, например, ASP.NET можно использовать в Windows, в Linux, в Solaris, в MacOS X, потому что эти API существуют как в .NET, так и в Mono. ASP.NET недоступен на некоторых поддерживаемых Microsoft платформах, таких как XBox или Windows Phone 7, и не поддерживается ни на других платформах, которые поддерживает Mono, таких как Wii или iPhone.
Следующая информация верна только по состоянию на 21 ноября, и многое в мире моно, скорее всего, изменится.
Те же самые принципы могут быть применены к другим стекам, полный список потребовал бы надлежащей таблицы, которую я не представляю, как представить здесь, но вот список технологий, которые могут отсутствовать на конкретной платформе. Вы можете предположить, что все, что не перечислено здесь, доступно (не стесняйтесь, присылайте мне правки для вещей, которые я пропустил):
Core Runtime Engine [везде]
- Поддержка Reflection.Emit [везде, кроме WP7, CF, Xbox, MonoTouch, PS3]
- Поддержка CPU SIMD [Linux, BSD, Solaris, MacOS X; Скоро PS3, MonoTouch и MonoDroid]
- Продолжения - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
- Разгрузка сборки [только для Windows]
- VM Injection [Linux, BSD, MacOS X, Solaris]
- DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
- Generics [некоторые ограничения для PS3 и iPhone].
Языки
- C # 4 [везде]
- Компилятор C # как сервис (Linux, MacOS, Solaris, BSD, Android)
- IronRuby [везде, кроме WP7, CF, Xbox, MonoTouch, PS3]
- IronPython [везде, кроме WP7, CF, Xbox, MonoTouch, PS3]
- F # [везде, кроме WP7, CF, Xbox, MonoTouch, PS3]
Серверные стеки
- ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
- ADO.NET [везде]
- LINQ to SQL [везде]
- Entity Framework [везде]
- Базовый стек XML [везде]
- XML-сериализация [везде, кроме WP7, CF, Xbox)
- LINQ to XML (везде)
- System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
- System.Messaging [Windows; в Linux, MacOS и Solaris требуется RabbitMQ]
- .NET 1 Enterprise Services [только для Windows]
- WCF [завершено в Windows; небольшое подмножество на Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
- Рабочий процесс Windows [только для Windows]
- Идентификация карточного пространства [только для Windows]
GUI стеки
- Silverlight (Windows, Mac, Linux - с лунным светом)
- WPF (только для Windows)
- Gtk # (Windows, Mac, Linux, BSD)
- Windows.Forms (Windows, Mac, Linux, BSD)
- MonoMac - встроенная интеграция с Mac (только для Mac)
- MonoTouch - встроенная интеграция с iPhone (только для iPhone / iPad)
- MonoDroid - встроенная интеграция с Android (только для Android)
- API Media Center - только для Windows
- Беспорядок (Windows и Linux)
Графические библиотеки
- GDI + (Windows, Linux, BSD, MacOS)
- Кварц (MacOS X, iPhone, iPad)
- Каир (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)
Моно библиотеки - кроссплатформенные, могут использоваться в .NET, но требуют сборки вручную
- Компилятор C # 4 как сервис
- Сесил - CIL Манипуляции, рабочий процесс, инструментарий CIL, Линкеры
- Библиотеки RelaxNG
- Mono.Data. * Поставщики базы данных
- Полный System.Xaml (для использования в установках, где .NET не предлагает стек)
MonoTouch означает Mono, работающий на iPhone; MonoDroid означает Mono, работающий на Android; Порты PS3 и Wii доступны только для квалифицированных разработчиков Sony и Nintendo.
Я извиняюсь за отсутствие формальностей.