Разница между вином и моно

31

Насколько я знаю, и Wine, и Mono используются для запуска приложений Windows под Ubuntu.

Так что мне было интересно

  1. в чем их отличия? Они обе виртуальные машины? Или каждый из них относится к какой-то другой категории?
  2. Когда лучше использовать какие приложения для Windows? Например, те приложения, которые могут требовать или не требовать .net Framework.
  3. Они зависят друг от друга? Они должны установить вместе? Или каждый работает независимо без существования другого?

Спасибо и всего наилучшего!

Тим
источник

Ответы:

34

Для успешного запуска программы необходимо соответствие трех вещей:

  • Набор инструкций ЦП (например, x86 на вашем ПК, ARM на вашем мобильном телефоне, PowerPC на некоторых Apple Mac, байт-код Java для апплетов Java, CLI для приложений ".Net" / Mono)
  • Двоичный формат файла (например, PE / COFF ".exe" для Microsoft Windows, .jar для Java-апплетов, PE32 ".exe", ELF в Unix / Linux)
  • Интерфейс прикладного программирования ; (Например, POSIX в Linux / Unix, Cocoa для Mac OSX, Win32 в Microsoft Windows, библиотека базовых классов для приложений «.Net» / Mono).

Вы можете увеличить вероятность совпадения всех трех, имея эмуляторы / интерпретаторы (для других наборов команд ЦП), имея дополнительные загрузчики файлов (для иностранных форматов файлов) и имея дополнительные библиотеки программирования, предоставляющие больше API.

Также обратите внимание, что некоторые процессоры могут выполнять более одного набора инструкций; ПК часто имеет наборы команд x86 и amd64 ; ARM процессор может выполнять четыре: ARM32 / Thumb / Java байткод / ThumbEE . Некоторые операционные системы также могут иметь более одного API (Microsoft Windows предоставляет Win32 и POSIX ).

Для всего остального вам нужно дополнительное программное обеспечение. Для запуска программ Java вам понадобятся три перечисленные выше части, чтобы заставить его работать: программа виртуальной машины Java для запуска байт-кода; способ запуска программ на Java и библиотека классов Java для вызываемых программ. «Java» - это торговая марка для нескольких отдельных технологий, изначально разработанных Sun, но для пользователя они часто загружаются как одна.

То же самое относится и к «.Net», который является торговой маркой маркетинга для нескольких различных технологий, первоначально разработанных Microsoft: Common Language Run-time / Base Class Library (CLR) - это API; VES - это загрузчик, а Common Language Interface (CLI) - это набор команд.

Вам не нужно загружать эти технологии от Microsoft, Sun или Intel только потому, что они изначально что-то изобрели. AMD делает процессоры совместимыми со стандартами Intel; Apache («Гармония») и Google («Android Dalvik») создают Java-подобный набор; и Mono предоставляет набор CLR / CLI / VES. Важно то, что все используют одни и те же стандарты, что делает их совместимыми. Диск DVD будет воспроизводиться на любом проигрывателе DVD, соответствующем стандарту, а веб-страница HTML будет отображаться в любом веб-браузере, соответствующем стандартам HTML.

  • Mono - это пакет CLR / CLI / VES, который может работать на Mac OSX, MS Windows и Linux.
  • Wine - это реализация Win32 API, которая может работать на Mac OSX, MS Windows и Linux.
  • Вы можете запустить Mono поверх Wine , поверх любой операционной системы.
  • Вы можете запустить Wine поверх Qemu , поверх любой архитектуры процессора.

Таким образом, Mono запускает приложения CLR .exe, а Wine - приложения Win32 .exe. Единственное, что общего в том, что имена файлов заканчиваются на «.exe»; содержимое совершенно другое и несовместимое, поэтому вам нужен правильный .

Так же, как интерпретатор Python выдаст ошибку при представлении с Perl (и наоборот), интерпретатор CLR выдаст ошибку при представлении с x86 + Win32 или JVM + Java bytecode. Если вы можете опубликовать ссылку на конкретную программу, которую вы хотите запустить, я или кто-то еще должны быть в состоянии сообщить вам точный набор инструкций, формат файла и API, для которого он был разработан, и что вам нужно установить в Linux запустить его. Надеюсь, это поможет!

(Иногда вам может даже понадобиться и то и другое. Например, симулятор поезда Openbve - это C # и скомпилирован в PE / COFF + CLI + CLR, но при желании можно использовать двоичные плагины C, скомпилированные для PE / COFF + Win32 + x86. В этом случае вы Нужна версия Mono для Win32 под Wine. Если архитектура процессора также отличается, то потребуется эмуляция, поэтому Mono для Wine под Qemu).

Сладен
источник
22

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

.NET - это ответ Microsoft на Java, а Mono - это реализация с открытым исходным кодом. Wine предназначен для собственных версий и не имеет ничего общего с Mono, за исключением того, что, возможно, вы можете запустить с ним среду выполнения .NET, как и любое другое встроенное программное обеспечение Windows.


Длинный ответ:

Чтобы понять разницу между Wine и Mono (и .NET), вы должны понимать разницу между исполняемыми файлами машинного кода и исполняемыми файлами «общеязыковой среды выполнения» или виртуальной машиной:

Собственные исполняемые файлы машинного кода используют коды команд, специфичные для вашего процессора, и выполняются им напрямую. Это означает, что они должны быть перекомпилированы для разных процессоров. Wine может запускать исполняемые файлы машинного кода для Windows, непосредственно выполняя этот исполняемый код и перехватывая любые вызовы библиотеки, которые он делает, перенаправляя их в свою собственную реализацию Win32 API.

Исполняемые файлы «CLR» или «VM» не относятся к одному процессору: им требуется дополнительное программное обеспечение, чтобы процессор мог их запускать. Mono / .NET является одним из примеров такого рода системы. Программам .NET требуется установить среду выполнения .NET, даже если вы запускаете их в Windows. Java работает так же.

Так:

1) разница между Wine и Mono: Wine - для запуска исполняемых файлов машинного кода, созданных для Windows, а Mono - для запуска исполняемых файлов Mono / .NET, которые не обязательно созданы для какой-либо конкретной платформы. Установка Mono в Linux эквивалентна установке среды выполнения .NET в Windows.

2) Если программа, которую вы хотите запустить, вообще не использует .NET, вы должны использовать Wine. Моно тебе здесь совсем не поможет.

Однако, если программа использует .NET, у вас есть два варианта, один из которых может работать или не работать:

  • Вы можете попробовать запустить его с помощью Mono. Это не удастся, если программа .NET также использует встроенные функции из win32 API, что делают многие (но не все) приложения .NET, созданные для Windows.

  • Кроме того, вы можете установить среду выполнения Microsoft .NET для Windows внутри Wine, а затем запустить приложение .NET через нее. Вы не будете использовать Mono вообще в этом случае.

3) Wine и Mono вообще не зависят друг от друга, но, как указано выше, вы можете использовать среду выполнения Microsoft .NET в Wine для запуска приложений Mono / .NET.

Алистер Бакстон
источник
Благодарность! (1) Таким образом, если приложение зависит как от .NET, так и от win32, единственный способ - установить .NET на Wine, а затем установить приложение на Wine? (2) Как узнать, использует ли приложение .NET и / или win32?
Тим
1
При наборе file *.exeбудет отображена информация о наборе команд процессора и типе файла. Если это приложение CLI / CLR (".Net" / Mono), которое также использует собственные вызовы Win32 API, вам нужно будет запустить его или искать любые file *.dllфайлы, которые отображаются как родные x86 + Win32.
Sladen
Вы также можете установить Mono для Windows в Wine, но, согласно Wine FAQ, он работает с меньшей вероятностью, чем среда выполнения .NET. Не существует простого способа узнать, использует ли программа .NET собственные вызовы win32, поскольку существует множество способов сделать это. Лучше всего сначала попробовать Mono, если он не работает, попробуйте Wine + .NET.
Алистер Бакстон