Mono часто используется для того, чтобы сказать: "Да, .NET кроссплатформенна". Насколько правомерно это утверждение?

Mono часто используется для того, чтобы сказать: "Да, .NET кроссплатформенна". Насколько правомерно это утверждение?
Mono часто используется для того, чтобы сказать: "Да, .NET кроссплатформенна". Насколько правомерно это утверждение? - akewidyastomo @ Unsplash

Ответ Sparkie понял, позвольте немного дополнить.

".NET является кроссплатформенным" - это слишком двусмысленное заявление, поскольку и фреймворк, и мир, для которого он изначально создавался, изменились и эволюционировали.

Короткий ответ таков:

Базовый движок, на котором работает .NET и его производные, Common Language Infrastructure Standard, является кроссплатформенным, и если вы хотите, чтобы ваш код работал на нескольких платформах, вам нужно планировать использование правильных API на правильной платформе, чтобы обеспечить наилучший опыт на каждой платформе.

Семейство CLI не пыталось использовать подход "Write Once, Run Anywhere", поскольку различия между телефоном и мейнфреймом слишком велики. Вместо этого появилась целая вселенная API и функций среды выполнения, специфичных для каждой платформы, чтобы дать разработчикам нужные инструменты для создания отличного опыта на каждой платформе.

Подумайте только: программисты больше не ориентируются на ПК с Windows или Unix-серверы. Сейчас мир, как никогда ранее, окружен интересными платформами - от ПК, игровых консолей, мощных телефонов, телевизионных приставок до больших серверов и распределенных кластеров машин. Единая для всех платформа будет просто раздута на крошечных устройствах и недостаточно мощна на больших системах.

Продукт .NET Framework от Microsoft не является кроссплатформенным, он работает только на 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
  • Компьютеры 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:
    • Вы используете полный Mono
  • Другие встроенные операционные системы:
    • Вы запускаете .NET MicroFramework или Mono с мобильным профилем.

В зависимости от ваших потребностей вышеперечисленного может быть достаточно или нет. Вы вряд ли получите одинаковый исходный код, который будет работать везде. Например, код XNA не будет работать на каждом настольном компьютере, а программы .NET Desktop не будут работать на XNA или телефоне. Как правило, вам нужно внести изменения в свой код, чтобы он работал в других профилях .NET Framework. Вот некоторые из известных мне профилей:

  • Профиль .NET 4.0
  • Профиль Silverlight
  • Профиль Windows Phone 7
  • Профиль XBox360
  • Профиль Mono core - повторяет профиль .NET и доступен для Linux, MacOS X, Solaris, Windows и BSD.
  • Микрофреймворк .NET
  • Профиль Mono на iPhone
  • Профиль Mono на Android
  • Профиль Mono на 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 ноября, и многое в мире Mono, вероятно, изменится.

Те же принципы могут быть применены и к другим стекам, полный список потребует соответствующей таблицы, которую я не представляю, как представить здесь, но вот список технологий, которые могут отсутствовать на конкретной платформе. Вы можете предположить, что все, что здесь не перечислено, доступно (не стесняйтесь присылать мне правки, если я что-то упустил):

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]
  • Дженерики [некоторые ограничения на PS3 и iPhone].

Языки

  • C# 4 [везде]
  • C# Compiler as a Service (Linux, MacOS, Solaris, BSD, Android)
  • IronRuby [везде, кроме WP7, CF, Xbox, MonoTouch, PS3]
  • IronPython [везде, execpt WP7, CF, Xbox, MonoTouch, PS3]
  • F# [везде, execpt 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 Workflow [только Windows]
  • Идентификация Cardspace [только для Windows]

Стеки GUI

  • Silverlight (Windows, Mac, Linux - с Moonlight)
  • WPF (только для Windows)
  • Gtk# (Windows, Mac, Linux, BSD)
  • Windows.Forms (Windows, Mac, Linux, BSD)
  • MonoMac - нативная интеграция с Mac (только Mac)
  • MonoTouch - нативная интеграция с iPhone (только для iPhone/iPad)
  • MonoDroid - нативная интеграция Android (только для Android)
  • APIs Media Center - только для Windows
  • Clutter (Windows и Linux)

Графические библиотеки

  • GDI+ (Windows, Linux, BSD, MacOS)
  • Quartz (MacOS X, iPhone, iPad)
  • Cairo (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)

Библиотеки Mono - кроссплатформенные, могут быть использованы в .NET, но требуют ручной сборки

  • C# 4 Компилятор как сервис
  • Cecil - манипуляции с CIL, рабочий процесс, инструментарий CIL, линкеры
  • Библиотеки RelaxNG
  • Mono.Data.* провайдеры баз данных
  • Полный System.Xaml (для использования в установках, где .NET не предлагает стек)

MonoTouch означает Mono, работающий на iPhone; MonoDroid означает Mono, работающий на Android; порты для PS3 и Wii доступны только квалифицированным разработчикам Sony и Nintendo.

Прошу прощения за отсутствие формальностей.


LetsCodeIt, 26 мая 2023 г., 04:33