Sự khác biệt giữa Rượu và Mono


31

Theo tôi biết, cả Wine và Mono đều được sử dụng để chạy các ứng dụng Windows trong Ubuntu.

Vì vậy, tôi đã tự hỏi

  1. sự khác biệt của họ là gì? Cả hai đều là máy ảo? Hay mỗi cái thuộc về một số loại khác?
  2. Tốt hơn là nên sử dụng cái nào cho loại ứng dụng Windows nào? Ví dụ: những ứng dụng có thể hoặc không yêu cầu .net Framework.
  3. Họ có phụ thuộc vào nhau không? Họ có cần phải cài đặt cùng nhau không? Hay mỗi người làm việc độc lập mà không có sự tồn tại của người kia?

Cảm ơn và trân trọng!

Câu trả lời:


34

Chạy thành công một chương trình yêu cầu ba điều phù hợp:

  • Bộ hướng dẫn CPU (Ví dụ: x86 trong PC, ARM trong điện thoại di động của bạn, PowerPC trong một số máy Mac của Apple, mã byte Java cho Applet Java, CLI cho các ứng dụng ".Net" / Mono)
  • Định dạng tệp nhị phân (Ví dụ: PE / COFF ".exe" cho Microsoft Windows, .jar cho Java Applet, PE32 ".exe", ELF trên Unix / Linux)
  • Giao diện lập trình ứng dụng ; (Ví dụ: POSIX trên Linux / Unix, Ca cao cho Mac OSX, Win32 trên Microsoft Windows, Thư viện lớp cơ sở cho các ứng dụng ".Net" / Mono).

Bạn có thể tăng cơ hội khớp cả ba bằng cách có trình giả lập / trình thông dịch (đối với các bộ hướng dẫn CPU khác), bằng cách có thêm trình tải tệp (đối với định dạng tệp nước ngoài) và có thêm thư viện lập trình cung cấp thêm API.

Cũng lưu ý rằng một số bộ xử lý có thể thực thi nhiều hơn một tập lệnh; một PC khá thường có các tập lệnh x86amd64 ; một bộ xử lý ARM có thể thực thi bốn: ARM32 / Thumb / Java bytecode / ThumbEE . Một số hệ điều hành có thể cung cấp nhiều hơn một API nguyên bản (Microsoft Windows cung cấp Win32POSIX ).

Đối với mọi thứ khác, bạn cần phần mềm bổ sung. Để chạy các chương trình Java, bạn cần ba phần được liệt kê ở trên để làm cho nó hoạt động: một chương trình Máy ảo Java để chạy mã byte; một cách khởi chạy các chương trình Java và Thư viện lớp Java để các chương trình gọi. "Java" là một tên thương hiệu ở đây cho một số công nghệ riêng biệt do Sun phát triển, nhưng với người dùng, chúng thường được tải xuống dưới dạng một.

Điều tương tự cũng áp dụng cho ".Net", là một thương hiệu tiếp thị cho một số công nghệ khác nhau được phát triển đầu tiên bởi Microsoft: Thư viện lớp thời gian chung / Thư viện lớp cơ sở (CLR) là API; VES là trình tải và Giao diện ngôn ngữ chung (CLI) là tập lệnh.

Bạn không cần phải tải xuống các công nghệ đó từ Microsoft, từ Sun hoặc từ Intel chỉ vì ban đầu họ đã phát minh ra thứ gì đó. AMD làm cho bộ xử lý tương thích với các tiêu chuẩn của Intel; cả Apache ("Harmony") và Google ("Android Dalvik") đều tạo ra một bộ giống như Java; và Mono cung cấp bộ CLR / CLI / VES. Điều quan trọng là mọi người đều sử dụng các tiêu chuẩn giống nhau, làm cho chúng tương thích. Một đĩa DVD sẽ phát trên bất kỳ trình phát DVD nào đáp ứng tiêu chuẩn và một trang web HTML sẽ hiển thị trong mọi Trình duyệt web đáp ứng các tiêu chuẩn HTML.

  • Mono là bộ CLR / CLI / VES có thể chạy trên Mac OSX, MS Windows và Linux.
  • Wine là một triển khai API Win32 có thể chạy trên Mac OSX, MS Windows và Linux.
  • Bạn có thể chạy Mono trên Wine , trên bất kỳ hệ điều hành nào.
  • Bạn có thể chạy Wine trên đỉnh Qemu , trên bất kỳ kiến ​​trúc CPU nào.

Vì vậy, Mono làm cho các ứng dụng CLR .exe chạy và Wine làm cho các ứng dụng Win32 .exe chạy. Điểm chung duy nhất là tên tệp kết thúc bằng ".exe"; nội dung hoàn toàn khác nhau và không tương thích, vì vậy bạn cần đúng .

Giống như trình thông dịch Python sẽ báo lỗi khi được trình bày với Perl (và ngược lại), trình thông dịch CLR sẽ báo lỗi khi được trình bày với mã byte x86 + Win32 hoặc JVM + Java. Nếu bạn có thể đăng một liên kết đến chương trình cụ thể mà bạn muốn chạy, bản thân tôi hoặc ai đó sẽ có thể cho bạn biết tập lệnh chính xác, định dạng tệp và API mà nó được thiết kế và những gì bạn cần cài đặt trên Linux để chạy nó Mong rằng sẽ giúp!

(Đôi khi bạn thậm chí có thể cần cả hai. Ví dụ, Openbve tàu mô phỏng là C # và biên soạn để PE / COFF + CLI + CLR, nhưng có thể tùy chọn sử dụng C plugins nhị phân được biên soạn cho PE / COFF + Win32 + x86. Trong trường hợp này, bạn cần một phiên bản Win32 của Mono theo Wine. Nếu kiến ​​trúc CPU cũng vậy, khác với nhu cầu mô phỏng, vì vậy Mono dưới Wine theo Qemu).


22

Câu trả lời ngắn gọn:

.NET là câu trả lời của Microsoft cho Java và Mono là một triển khai mã nguồn mở của nó. Wine dành cho người bản địa và không liên quan gì đến Mono ngoại trừ việc bạn có thể chạy thời gian chạy .NET với nó, giống như bất kỳ phần mềm Windows gốc nào khác.


Câu trả lời dài:

Để hiểu sự khác biệt giữa Wine và Mono (và .NET), bạn phải hiểu sự khác biệt giữa các tệp thực thi mã máy nguyên gốc và "thời gian chạy ngôn ngữ chung" hay còn gọi là thực thi "máy ảo":

Các mã thực thi mã máy gốc sử dụng các mã lệnh dành riêng cho bộ xử lý của bạn và được thực thi trực tiếp bởi nó. Điều đó có nghĩa là chúng phải được biên dịch lại cho các bộ xử lý khác nhau. Wine có thể chạy các mã thực thi mã máy riêng cho Windows bằng cách chạy trực tiếp mã thực thi này và bắt bất kỳ lệnh gọi thư viện nào thực hiện, chuyển hướng chúng sang triển khai API Win32 của chính nó.

Các tệp thực thi "CLR" hoặc "VM" không dành riêng cho một bộ xử lý: Họ cần thêm một phần mềm để cho phép bộ xử lý chạy chúng. Mono / .NET là một ví dụ như vậy của loại hệ thống này. Các chương trình .NET cần có thời gian chạy .NET được cài đặt ngay cả khi bạn chạy chúng trên Windows. Java hoạt động theo cùng một cách.

Vì thế:

1) sự khác biệt giữa Wine và Mono: Wine dành cho việc chạy các mã thực thi mã máy gốc được tạo cho Windows và Mono là để chạy các tệp thực thi Mono / .NET không nhất thiết phải được tạo cho bất kỳ nền tảng cụ thể nào. Cài đặt Mono trên Linux tương đương với cài đặt thời gian chạy .NET trên Windows.

2) Nếu chương trình bạn muốn chạy hoàn toàn không sử dụng .NET, bạn phải sử dụng Wine. Mono sẽ không giúp bạn ở đây.

Tuy nhiên, nếu chương trình sử dụng .NET, bạn có hai tùy chọn, một trong hai tùy chọn có thể hoặc không hoạt động:

  • Bạn có thể thử chạy nó bằng Mono. Điều này sẽ thất bại nếu chương trình .NET cũng sử dụng các hàm riêng từ API win32, điều mà nhiều (nhưng không phải tất cả) các ứng dụng .NET được tạo cho Windows làm.

  • Ngoài ra, bạn có thể cài đặt thời gian chạy Microsoft .NET cho các cửa sổ bên trong Wine và sau đó chạy ứng dụng .NET thông qua nó. Bạn sẽ không sử dụng Mono trong trường hợp này.

3) Wine và Mono hoàn toàn không phụ thuộc vào nhau, nhưng như đã nêu ở trên, bạn có thể sử dụng thời gian chạy Microsoft .NET trong Wine để chạy các ứng dụng Mono / .NET.


Cảm ơn! (1) Vậy nếu một ứng dụng phụ thuộc vào cả .NET và win32, cách duy nhất là cài đặt .NET trên Wine và sau đó cài đặt ứng dụng trên Wine? (2) Làm thế nào để biết một ứng dụng có dựa trên .NET và / hoặc win32 không?
Tim

1
Nhập file *.exesẽ hiển thị thông tin về tập lệnh CPU và loại tệp. Nếu đó là ứng dụng CLI / CLR (".Net" / Mono) cũng sử dụng các lệnh gọi API Win32 gốc, bạn sẽ cần chạy nó hoặc tìm bất kỳ file *.dlltệp nào hiển thị là bản gốc x86 + Win32.
sladen

Bạn cũng có thể cài đặt Mono cho Windows trong Wine nhưng theo Wine FAQ, nó ít có khả năng hoạt động hơn so với thời gian chạy .NET. Không có cách nào đơn giản để biết liệu một chương trình .NET có sử dụng các cuộc gọi win32 riêng hay không vì có rất nhiều cách khác nhau để họ có thể thực hiện. Điều tốt nhất để làm là thử Mono trước, nếu nó không hoạt động, hãy thử Wine + .NET.
Alistair Buxton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.