Это старый вопрос (с уже выбранным ответом), но я не думаю, что на него действительно дан хороший ответ.
Сначала немного предыстории ...
Как работает .NET?
Традиционный файл Windows .EXE - это двоичный файл, который представляет собой серию инструкций на машинном языке, которые понимает ваш компьютер, и который выполняет вызовы Win32 API, которые являются частями Windows, которые предоставляют услуги, которыми могут воспользоваться приложения. Используемый машинный язык очень специфичен для вашего типа компьютера, а вызовы Win32 делают исполняемый файл очень зависимым от Windows. Исполняемый файл .NET не такой.
Важно понимать, что исполняемый файл .NET (файл .EXE) на самом деле не является собственным приложением Windows. Сама Windows не понимает, как запустить код в исполняемом файле .NET. Ваш компьютер тоже этого не понимает.
Как и Java, приложение .NET состоит из инструкций на языке CIL (Common Intermediate Language), который вы можете рассматривать как машинный язык для идеализированного компьютера, которого на самом деле не существует. В .NET программная реализация этой идеализированной машины называется Common Language Runtime (CLR). Эквивалент в мире Java называется виртуальной машиной Java (JVM). В Java эквивалент CIL называется байт-кодом Java. CIL иногда называют MSIL (Microsoft Intermediate Language).
CIL разработан для работы на CLR (идеализированной машине), но в остальном он не зависит от платформы, что означает, что CIL не заботится о том, какой у вас компьютер или какая операционная система работает.
Так же, как вам нужна собственная версия Java JVM на каждой платформе, на которой вы хотите запускать Java, вам нужна собственная версия CLR для запуска исполняемых файлов .NET CIL. CLR - это собственное приложение Windows, подобное традиционным Win32 EXE-файлам, описанным выше. Сама среда CLR специфична для реализации Windows и архитектуры компьютера, на которой она была разработана.
Неважно, с какого языка .NET вы начинаете (C #, VisualBasic, F #, IronPython, IronRuby, Boo и т. Д.), Все они компилируются в байт-код CIL. Вы можете легко «разобрать» программу CIL на объектно-ориентированный язык ассемблера, который легко читается людьми. Вы можете написать программу на CIL сами, но это мало кто делает.
В Windows CLR компилирует этот код CIL точно в срок (JIT) прямо при запуске исполняемого файла - непосредственно перед фактическим запуском кода. Это означает, что байт-код CIL преобразуется (компилируется) в реальный машинный код, который изначально выполняется на вашем компьютере. Эта часть CLR называется JIT-компилятором или часто просто JIT.
На сегодняшний день Microsoft выпустила четыре версии CLR: 1.0, 1.1, 2.0 и 4.0. У вас должна быть установлена правильная версия CLR на вашем компьютере, если вы хотите запускать исполняемые файлы .NET, ориентированные на эту среду выполнения. CLR 2.0 поддерживает приложения .NET 2.0, 3.0 и 3.5. Для других версий .NET версия .NET полностью соответствует версии CLR.
Помимо JIT / CLR, .NET предоставляет множество библиотек (сборок), составляющих остальную часть .NET framework и предоставляющих множество возможностей и служб, которые могут вызывать .NET-приложения. Подавляющее большинство этих сборок представляют собой чистый код CIL, работающий в среде CLR. В Windows некоторые также обращаются к Win32 API. При установке .NET вы устанавливаете CLR, библиотеки классов (фреймворк) и набор инструментов разработки. Для каждой версии среды CLR обычно требуется полный набор этих «каркасных» сборок. Некоторые версии .NET (например, 3.0 и 3.5) добавляли дополнительные сборки инфраструктуры без обновления среды CLR или существующих сборок, связанных с этой средой CLR.
Формат файла Portable Executable (PE), в котором доставляется файл Windows .EXE, содержит заголовок, который описывает исполняемый файл и идентифицирует файл как файл .NET или собственный файл Win32. Когда Windows пытается запустить файл .NET, она видит этот заголовок и автоматически вызывает среду CLR от вашего имени. Вот почему файлы .NET EXE изначально запускаются в Windows.
Итак, как работает Mono?
Mono реализует CLR на Linux, Mac и других платформах. Среда выполнения Mono (CLR) - это собственное приложение, написанное в основном на языке C и скомпилированное до кода машинного языка для компьютерной системы, на которой она предназначена. Как и в Windows, среда выполнения Mono зависит от операционной системы и типа используемой вами машины.
Как и в Windows, среда выполнения Mono (CLR) компилирует байт-код CIL в исполняемом файле .NET точно в срок в собственный код, который ваш компьютер может понять и выполнить. Таким образом, файл .NET является таким же «родным» для Linux, как и для Windows.
Чтобы перенести Mono на новую архитектуру, вам необходимо перенести JIT / CLR. Это похоже на перенос любого собственного приложения на новую платформу.
Насколько хорошо .NET-код работает в Linux или Mac, на самом деле просто вопрос того, насколько хорошо CLR реализована в этих системах. Теоретически Mono CLR может выполнять код .NET в этих системах намного лучше, чем версия .NET для MS в Windows. На практике реализация MS обычно лучше (хотя и не во всех случаях).
В дополнение к CLR Mono предоставляет большую часть остальных библиотек (сборок), составляющих платформу .NET. Так же, как и в версии .NET от Microsoft (а точнее, даже больше), сборки Mono предоставляются в виде байт-кода CIL. Это позволяет взять файл * .dll или * .exe из Mono и запустить его без изменений в Windows, Mac или Linux, поскольку CIL является «родным» языком реализаций CLR в этих системах.
Как и в Windows, Mono поддерживает несколько версий CLR и связанных сборок:
Очень ранние версии Mono (до 1.2?) Поддерживали только CLR 1.0 или 1.1. Mono не поддерживал большие фрагменты фреймворка 2.0 до своей собственной версии 2.0.
Версии Mono до версии 2.4 поддерживали приложения CLR 1.1 и CLR 2.0.
Начиная с Mono 2.6, была добавлена CLR 4.0, но CLR 2.0 по-прежнему использовалась по умолчанию.
Начиная с Mono 2.8, по умолчанию используется среда CLR 4.0, а среда CLR 1.1 больше не поддерживается.
Mono 2.10 продолжает использовать CLR 4.0 по умолчанию, а также поддерживает CLR 2.0.
Как и настоящий .NET (но в гораздо меньшем количестве случаев), есть некоторые сборки Mono, которые обращаются к собственным библиотекам. Чтобы сборка System.Drawing работала на Mono, команда Mono написала программу для Linux, имитирующую GDI + часть Win32 API в Linux. Эта библиотека называется libgdiplus. Если вы компилируете Mono из исходного кода, вы заметите, что вам нужно собрать этот файл libgdiplus, прежде чем вы сможете собрать mono. Вам не нужен libgdiplus в Windows, потому что часть GDI + Win32 API уже является частью Windows. Для полного переноса Mono на новые платформы требуется также портировать эту библиотеку libgdiplus.
В тех областях, где дизайн библиотеки .NET чрезмерно зависит от дизайна Windows и плохо подходит для таких систем, как Mac или Linux, команда Mono написала расширения для .NET framework. Расширения Mono также представляют собой байт-код CIL и обычно отлично работают в .NET.
В отличие от Windows, Linux обычно не обнаруживает исполняемые файлы .NET и по умолчанию запускает среду CLR. Обычно пользователь должен запускать среду CLR напрямую, набрав «mono appname.exe» или что-то подобное. Здесь mono - это приложение, реализующее CLR, а appname.exe - это EXE-файл, содержащий исполняемый код .NET.
Чтобы упростить пользователям задачу, приложения Mono часто заключаются в оболочку сценария, запускающего среду CLR. Это скрывает тот факт, что среда CLR используется так же, как в Windows. Также можно указать Linux запускать среду CLR при обнаружении файла, использующего формат файла PE. Обычно это не делается, поскольку формат PE-файла также используется для собственных исполняемых файлов Win32 Windows, которые, конечно, не поддерживает CLR (Mono).
Нет никакой технической причины, по которой средство запуска PE не может использоваться Linux, который затем запускает либо систему, которая понимает собственный код Windows (например, Wine), либо CLR (Mono), в зависимости от ситуации. Насколько мне известно, этого просто не было сделано.
Взад и вперед
Любой код .NET, который придерживается «полностью управляемого» кода, что означает, что он не вызывает код, отличный от .NET, должен нормально работать в Mono на всех платформах. Я обычно использую скомпилированные сборки .NET из Windows (для которых у меня нет кода) в Linux и Mac.
Я также могу взять любой код, который я компилирую в Mono, и запустить его в .NET в Windows. Я могу предоставить клиенту код, который я скомпилировал с помощью Mono, и не беспокоиться о том, работает ли он, например, в 32-битной или 64-битной Windows. Для курса у клиента должна быть установлена правильная версия .NET (правильная среда CLR). CLR 2.0 существует уже очень давно, и можно поспорить, что он установлен почти у всех пользователей Windows. Компиляторы Mono и другой код также являются просто исполняемыми файлами CIL, поэтому они отлично работают в Windows, если хотите.
Совместимость с моно достаточно хороша, чтобы большие фрагменты реального кода Microsoft, такие как ASP.NET MVC, можно было взять (там, где это разрешено) из фактической версии .NET для MS и запустить на Mac или Linux. В целом команда Mono проделала огромную работу по реализации как CLR, так и остальной части фреймворка (библиотеки классов / сборки).
ASP.NET
В Windows Internet Information Server (IIS) знает, как вызвать среду CLR для выполнения .NET как части веб-приложения. В Linux / Mac есть модуль Apache (mod_mono), который предоставляет аналогичные возможности веб-серверу Apache. Это приложение написано на C и также должно быть перенесено на новые архитектуры.
Перенос Mono
В этом обсуждении были определены части Mono, которые созданы как «собственные» исполняемые файлы и должны существовать в системе, в которой вы хотите запускать приложения .NET.
- CLR (включая JIT-компилятор) - обычно известный как Mono
- libgdiplus (для систем, которые изначально не поддерживают GDI + API [только Windows поддерживает])
- mod_mono (чтобы Apache мог вызывать CLR для веб-приложений .NET)
Эти три компонента с добавлением библиотек классов обеспечивают среду .NET, которая выглядит «родной» для исполняемых файлов .NET, которые необходимо запустить.
Так работает Mono.
person
Justin
schedule
04.03.2011