Apakah Mono siap untuk prime time? [Tutup]

314

Adakah yang menggunakan Mono, implementasi .NET open source pada proyek berukuran besar atau sedang? Saya ingin tahu apakah ini siap untuk dunia nyata, lingkungan produksi. Apakah stabil, cepat, kompatibel, ... cukup untuk digunakan? Apakah perlu banyak upaya untuk mem-port proyek ke runtime Mono, atau benar- benar cukup kompatibel untuk hanya mengambil dan menjalankan kode yang sudah ditulis untuk runtime Microsoft?

wvdschel
sumber
17
Mindtouch.com menggunakan C # di Mono on Debian untuk platform wiki yang sangat kuat. Pergi memeriksanya. Anda bahkan dapat mengunduh VM yang telah dikonfigurasi sebelumnya yang dapat Anda atur dan gunakan dengan mudah.
lamcro
7
Saya telah menemukan bahwa penggunaan mono yang terbaik adalah dengan mengatakan, "Jika Microsoft melakukan XXX, kita dapat beralih ke mono di unix ..."
Ian Ringrose
5
Saya pikir pertanyaan ini pantas ditanyakan kembali, mengingat segala sesuatu yang telah berubah sejak yang satu ini.
Jwosty

Jawaban:

402

Ada beberapa skenario untuk dipertimbangkan: (a) jika Anda porting aplikasi yang ada dan bertanya-tanya apakah Mono cukup baik untuk tugas ini; (B) Anda mulai menulis beberapa kode baru, dan Anda ingin tahu apakah Mono cukup matang.

Untuk kasus pertama, Anda dapat menggunakan alat Mono Migration Analyzer (Moma) untuk mengevaluasi seberapa jauh aplikasi Anda berjalan di Mono. Jika evaluasi kembali dengan warna terbang, Anda harus memulai pengujian dan QA Anda dan bersiap untuk mengirim.

Jika evaluasi Anda kembali dengan fitur yang menyoroti laporan yang hilang atau berbeda secara signifikan dalam semantik mereka di Mono Anda harus mengevaluasi apakah kode dapat diadaptasi, ditulis ulang atau dalam kasus terburuk apakah aplikasi Anda dapat bekerja dengan fungsionalitas yang berkurang.

Menurut statistik Moma kami berdasarkan pada pengiriman pengguna (ini dari memori) sekitar 50% dari aplikasi bekerja di luar kotak, sekitar 25% membutuhkan sekitar satu minggu kerja (refactoring, beradaptasi) 15% lainnya memerlukan komitmen serius untuk ulang potongan kode Anda, dan sisanya hanya tidak layak mengganggu porting karena mereka sangat terikat dengan Win32. Pada titik itu, baik Anda mulai dari nol, atau keputusan bisnis akan mendorong upaya untuk membuat kode Anda portabel, tetapi kami sedang berbicara tentang pekerjaan berbulan-bulan (setidaknya dari laporan yang kami miliki).

Jika Anda memulai dari awal, situasinya jauh lebih sederhana, karena Anda hanya akan menggunakan API yang ada di Mono. Selama Anda tetap dengan tumpukan yang didukung (yang cukup banyak. NET 2.0, ditambah semua peningkatan inti dalam 3,5 termasuk LINQ dan System.Core, ditambah salah satu API lintas platform Mono), Anda akan baik-baik saja.

Sesekali Anda mungkin mengalami bug di Mono atau keterbatasan, dan Anda mungkin harus mengatasinya, tetapi itu tidak berbeda dari sistem lain.

Adapun portabilitas: Aplikasi ASP.NET adalah yang lebih mudah untuk port, karena mereka memiliki sedikit atau tidak ada ketergantungan pada Win32 dan Anda bahkan dapat menggunakan SQL server atau database populer lainnya (ada banyak penyedia database yang dibundel dengan Mono).

Windows.Form porting terkadang lebih sulit karena pengembang ingin keluar dari .NET sandbox dan P / Luncurkan otak mereka untuk mengonfigurasi hal-hal yang berguna seperti mengubah kursor yang berkedip yang dinyatakan sebagai dua titik bezier yang dikodekan dalam bentuk BCD di wParam. Atau sampah seperti itu.

miguel.de.icaza
sumber
276
pikir orang ini siapa dia? pencipta mono ??? !! ... o tunggu ..
15
@ Drahcir: LINQ bekerja di Mono. Ini bukan khusus Windows. Jadi silakan dan coba Linux.
Zifre
31
"hal-hal yang berguna seperti mengubah kursor berkedip yang dinyatakan sebagai dua titik bezier yang dikodekan dalam bentuk BCD dalam sebuah wParam" lol
usr
12
Terima kasih banyak untuk Mono ...
Evan Plaice
28
miguel, alangkah baiknya untuk mendapatkan pembaruan pada posting ini ;-)
David Schmitt
65

Ini memiliki jangkauan yang cukup luas hingga .NET 4.0 dan bahkan menyertakan beberapa fitur dari .NET 4.5 API, tetapi ada beberapa area yang kami pilih untuk tidak diterapkan karena API tidak digunakan lagi, alternatif baru dibuat atau cakupannya terlalu besar. API berikut tidak tersedia di Mono:

  • Windows Presentation Foundation
  • Windows Workflow Foundation (tak satu pun dari dua versi)
  • Kerangka Entitas
  • WSE1 / WSE2 "add-ons" ke stack Layanan Web standar

Selain itu, implementasi WCF kami terbatas pada apa yang didukung Silverlight.

Cara termudah untuk memeriksa proyek spesifik Anda adalah menjalankan Mono Migration Analyzer (MoMA) . Keuntungannya adalah akan memberi tahu tim Mono tentang masalah yang akan mencegah Anda menggunakan Mono (jika ada), yang memungkinkan mereka memprioritaskan pekerjaan mereka.

Saya baru-baru ini menjalankan MoMA di SubSonic dan hanya menemukan satu masalah - penggunaan aneh tipe Nullable. Itu basis kode yang besar, sehingga cakupan di sana cukup mengesankan.

Mono digunakan secara aktif dalam beberapa produk komersial maupun open source . Ini digunakan dalam beberapa aplikasi besar, seperti Wikipedia dan Pusat Pengembang Mozilla , dan telah digunakan dalam aplikasi yang disematkan seperti pemutar MP3 Sansa dan mendukung ribuan game yang diterbitkan.

Pada tingkat bahasa, kompiler Mono sepenuhnya sesuai dengan spesifikasi bahasa C # 5.0 .

Jon Galloway
sumber
39

Di sisi desktop, Mono berfungsi dengan baik jika Anda berkomitmen untuk menggunakan GTK #. Implementasi Windows.Forms masih sedikit buggy (misalnya, TrayIcon tidak berfungsi) tetapi telah datang jauh. Selain itu, GTK # adalah toolkit yang lebih baik daripada Windows Forms.

Di sisi web, Mono telah menerapkan cukup ASP.NET untuk menjalankan sebagian besar situs dengan sempurna. Kesulitan di sini adalah menemukan host yang mod_mono telah diinstal pada apache, atau melakukannya sendiri jika Anda memiliki akses shell ke host Anda.

Either way, Mono hebat, dan stabil.

Hal-hal penting yang perlu diingat ketika membuat program lintas platform:

  • Gunakan GTK # sebagai pengganti Windows.Forms
  • Pastikan untuk membungkus nama file Anda dengan benar
  • Gunakan Path.Separatoralih-alih hardcoding "\", juga gunakan Environment.NewLinesebagai ganti "\n".
  • Jangan gunakan panggilan P / Invoked ke Win32 API.
  • Jangan gunakan Windows Registry.
FlySwat
sumber
2
Path.Separator adalah saran yang bagus, kecuali Mono di OS X memiliki ':', bukan '/'! Ha! Itu pemisah Mac OS (<= 9.0) yang lama. Apa Unix adalah / sepenuhnya.
Jared Updike
3
Saya tidak peduli dengan Environment.NewLine atau Path.Separator, cukup gunakan / dan \ n. Setiap sistem desktop saat ini sedang populer digunakan (kecuali saya kehilangan beberapa), menggunakan / dan \ n. Windows lebih suka \ dan \ r \ n, tetapi dengan senang hati akan menggunakan yang unix.
Programmdude
23

Saya pribadi menggunakan Mono dalam waktu prime time. Saya menjalankan server mono berurusan dengan giga-byte dari udp / tcp tugas pemrosesan data terkait dan tidak bisa lebih bahagia.

Ada kekhasan, dan salah satu hal yang paling menyebalkan adalah Anda tidak bisa hanya "membangun" file msbuild Anda karena keadaan Mono saat ini:

  • MonoDevelop (IDE) memiliki beberapa dukungan msbuild parsial, tetapi pada dasarnya akan merusak konfigurasi build "REAL" di luar hello-world sederhana (tugas build kustom, "properti" dinamis seperti $ (SolutionDir), konfigurasi nyata untuk nama beberapa mati -akhir)
  • xbuild yang HARUS menjadi mono-disediakan-msbuild-sepenuhnya-kompatibel-membangun-sistem bahkan lebih mengerikan, sehingga membangun dari baris perintah sebenarnya pengalaman yang lebih buruk daripada menggunakan GUI, yang merupakan kondisi yang sangat "tidak lazim" dari penyatuan untuk lingkungan Linux ...

Once / Selama mendapatkan barang-barang Anda sebenarnya DIBANGUN, Anda mungkin melihat beberapa hutan belantara bahkan untuk kode yang HARUS didukung seperti:

  • kompiler borked pada konstruksi tertentu
  • dan beberapa kelas .NET baru yang lebih canggih / baru melempar omong kosong yang tidak diharapkan pada Anda (XLinq, siapa pun?)
  • beberapa "fitur" runtime yang belum matang (batas tumpukan 3GB ON x64 ... WTF!)

tetapi naik turun mengatakan bahwa secara umum hal-hal mulai bekerja dengan sangat cepat, dan solusi / solusi berlimpah .

Setelah Anda mengatasi rintangan awal tersebut, pengalaman saya adalah ROCKS mono itu, dan terus menjadi lebih baik dengan setiap iterasi .

Saya memiliki server yang berjalan dengan mono, memproses 300GB data per hari, dengan ton p / invoke dan secara umum melakukan BANYAK pekerjaan dan tetap UP selama 5-6 bulan, bahkan dengan mono "pendarahan".

Semoga ini membantu.

damageboy
sumber
1
dapatkah Anda memberi tahu saya (jika Anda bisa) apa situs web yang sedang Anda bicarakan?
Christophe Debove
21

Rekomendasi untuk jawaban yang diterima agak ketinggalan zaman sekarang.

  • Implementasi bentuk windows sudah cukup bagus sekarang. (Lihat Paint-Mono untuk port Paint.net yang merupakan aplikasi formulir Windows yang cukup terlibat. Yang diperlukan hanyalah lapisan emulasi untuk beberapa panggilan sistem P-Invoke dan sistem yang tidak didukung).
  • Path.Combine serta Path.Seperator untuk bergabung dengan path dan nama file.
  • Windows Registry OK, selama Anda hanya menggunakannya untuk menyimpan dan mengambil data dari aplikasi Anda (yaitu Anda tidak dapat memperoleh informasi tentang Windows dari itu, karena pada dasarnya ini adalah registri untuk aplikasi Mono).
Kris Erickson
sumber
+1 untuk tindak lanjut ... sepertinya halaman ini mungkin kedaluwarsa sekali lagi.
Harpo
1
Ya, dua tahun adalah seumur hidup di Mono dengan kecepatan kerja mereka.
Kris Erickson
12

Jika Anda ingin menggunakan WPF Anda kurang beruntung Mono saat ini tidak memiliki rencana untuk mengimplementasikannya.

http://www.mono-project.com/WPF

trampster
sumber
3
Itu sangat buruk. WPF adalah toolkit UI yang layak.
JP Richardson
@ JP Richardson Saya mengerti apa yang Anda maksud - itu bagus saat pemrograman - tetapi saya tidak akan menyebutnya "layak" jika dibangun dari konsepsi dengan tujuan untuk menjadi alat bantu yang tidak portabel.
Wyatt8740
@ Wyatt8740 komentar saya ditulis 10 tahun yang lalu.
JP Richardson
@ JP Richardson lol, salahku. Tapi itu masih tidak dimaksudkan untuk portabel bahkan sepuluh tahun yang lalu.
Wyatt8740
9

Ya, mono itu bagus, tetapi sejauh yang saya bisa lihat, itu tidak stabil. Ini bekerja, tetapi kesalahan ketika Anda memberikan proses mono pekerjaan yang serius untuk dilakukan.

TL; DR - Jangan gunakan mono jika Anda:

  • gunakan AppDomains (Assembly Load \ Unload) di lingkungan multithreaded
  • Tidak dapat mempertahankan model 'biarkan-gagal'
  • Mengalami kejadian beban berat sesekali selama proses berjalan

Jadi faktanya.

Kami menggunakan mono-2.6.7 (.net v 3.5) di RHEL5, Ubuntu, dan, menurut saya, ini adalah versi paling stabil yang dibuat oleh Novell. Ini memiliki masalah dengan Membongkar AppDomains (segfaults), namun gagal sangat langka dan sejauh ini dapat diterima (oleh kami).

Baik. Tetapi jika Anda ingin menggunakan fitur .net 4.0, Anda harus beralih ke versi 2.10.x, atau 3.x, dan di situlah masalah dimulai.

Dibandingkan dengan 2.6.7, versi baru tidak dapat diterima untuk digunakan. Saya menulis aplikasi stress test sederhana untuk menguji instalasi mono.

Itu ada di sini, dengan instruksi untuk digunakan: https://github.com/head-thrash/stress_test_mono

Ia menggunakan Thread Pool Worker Threads. Pekerja memuat dll ke AppDomain dan mencoba melakukan beberapa pekerjaan matematika. Beberapa pekerjaan banyak-utasnya, beberapa lainnya tunggal. Hampir semua pekerjaan terikat dengan CPU, meskipun ada beberapa pembacaan file dari disk.

Hasilnya tidak terlalu bagus. Bahkan, untuk versi 3.0.12:

  • Proses Segfault sgen GC hampir dengan segera
  • mono dengan boehm hidup lebih lama (dari 2 hingga 5 jam), tetapi segfault akhirnya

Seperti disebutkan di atas, sgen gc tidak berfungsi (mono dibangun dari sumber):

* Assertion: should not be reached at sgen-scan-object.h:111

Stacktrace:


Native stacktrace:

    mono() [0x4ab0ad]
    /lib/x86_64-linux-gnu/libpthread.so.0(+0xfcb0) [0x2b61ea830cb0]
    /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x35) [0x2b61eaa74425]
    /lib/x86_64-linux-gnu/libc.so.6(abort+0x17b) [0x2b61eaa77b8b]
    mono() [0x62b49d]
    mono() [0x62b5d6]
    mono() [0x5d4f84]
    mono() [0x5cb0af]
    mono() [0x5cb2cc]
    mono() [0x5cccfd]
    mono() [0x5cd944]
    mono() [0x5d12b6]
    mono(mono_gc_collect+0x28) [0x5d16f8]
    mono(mono_domain_finalize+0x7c) [0x59fb1c]
    mono() [0x596ef0]
    mono() [0x616f13]
    mono() [0x626ee0]
    /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x2b61ea828e9a]
    /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x2b61eab31ccd]

Adapun boehm segfauls - misalnya (Ubuntu 13.04, mono built from source):

mono: mini-amd64.c:492: amd64_patch: Assertion `0' failed.
Stacktrace:
at <unknown> <0xffffffff>
at System.Collections.Generic.Dictionary`2.Init (int,System.Collections.Generic.IEqualityComparer`1<TKey>) [0x00012] in /home/bkmz/my/mono/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:264
at System.Collections.Generic.Dictionary`2..ctor () [0x00006] in /home/bkmz/my/mono/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:222
at System.Security.Cryptography.CryptoConfig/CryptoHandler..ctor (System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00014] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/Crypto
Config.cs:582
at System.Security.Cryptography.CryptoConfig.LoadConfig (string,System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00013] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoCo
nfig.cs:473
at System.Security.Cryptography.CryptoConfig.Initialize () [0x00697] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:457
at System.Security.Cryptography.CryptoConfig.CreateFromName (string,object[]) [0x00027] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:495
at System.Security.Cryptography.CryptoConfig.CreateFromName (string) [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:484
at System.Security.Cryptography.RandomNumberGenerator.Create (string) [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:59
at System.Security.Cryptography.RandomNumberGenerator.Create () [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:53
at System.Guid.NewGuid () [0x0001e] in /home/bkmz/my/mono/mcs/class/corlib/System/Guid.cs:492

Atau (RHEL5, mono diambil dari rpm di sini ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home%3A/vmas%3A/vono%3A/mono-centos5 )

Assertion at mini.c:3783, condition `code' not met
Stacktrace:
at <unknown> <0xffffffff>
at System.IO.StreamReader.ReadBuffer () [0x00012] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.IO/StreamReader.cs:394
at System.IO.StreamReader.Peek () [0x00006] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.IO/StreamReader.cs:429
at Mono.Xml.SmallXmlParser.Peek () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/Mono.Xml/SmallXmlParser.cs:271
at Mono.Xml.SmallXmlParser.Parse (System.IO.TextReader,Mono.Xml.SmallXmlParser/IContentHandler) [0x00020] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/Mono.Xml/SmallXmlParser.cs:346
at System.Security.Cryptography.CryptoConfig.LoadConfig (string,System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00021] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptog
raphy/CryptoConfig.cs:475
at System.Security.Cryptography.CryptoConfig.Initialize () [0x00697] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:457
at System.Security.Cryptography.CryptoConfig.CreateFromName (string,object[]) [0x00027] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:495
at System.Security.Cryptography.CryptoConfig.CreateFromName (string) [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:484
at System.Security.Cryptography.RandomNumberGenerator.Create (string) [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:59
at System.Security.Cryptography.RandomNumberGenerator.Create () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:53
at System.Guid.NewGuid () [0x0001e] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System/Guid.cs:483
at System.Runtime.Remoting.RemotingServices.NewUri () [0x00020] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs:356
at System.Runtime.Remoting.RemotingServices.Marshal (System.MarshalByRefObject,string,System.Type) [0x000ba] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs:329
at System.AppDomain.GetMarshalledDomainObjRef () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System/AppDomain.cs:1363

Kedua kegagalan entah bagaimana terhubung ke logika AppDomains, jadi, Anda harus menjauh dari mereka dalam mono.

BTW, program yang diuji bekerja 24 jam pada mesin Windows di MS .NET 4.5 env tanpa gagal.

Jadi, sebagai kesimpulan, saya ingin mengatakan - gunakan mono dengan hati-hati. Ini bekerja dari pandangan pertama, tetapi dapat dengan mudah gagal kapan saja. Anda akan dibiarkan dengan sekelompok dump inti dan kehilangan kepercayaan besar dalam proyek opensource.

head_thrash
sumber
5

MoMA adalah alat yang hebat untuk ini, seperti yang disarankan orang lain. Sumber ketidakcocokan terbesar hari ini adalah aplikasi yang DllImport (atau P / Invoke) ke pustaka Win32. Beberapa majelis tidak diimplementasikan, tetapi kebanyakan dari mereka hanya Windows dan benar-benar tidak masuk akal di Linux. Saya pikir cukup aman untuk mengatakan bahwa sebagian besar aplikasi ASP.NET dapat berjalan di Mono dengan modifikasi terbatas.

(Pengungkapan: Saya telah berkontribusi untuk Mono sendiri, serta aplikasi tertulis yang berjalan di atasnya.)

Joe Shaw
sumber
4
Itu Penganalisa Migrasi Mono bagi siapa pun yang menggaruk-garuk kepala bertanya-tanya apa hubungannya dengan Museum Seni Modern.
Ferruccio
4

Dalam banyak kasus, Anda dapat mengambil kode yang ada dan menjalankannya di Mono, terutama jika Anda porting aplikasi ASP.NET.

Dalam beberapa kasus, Anda mungkin memerlukan seluruh bagian kode baru untuk membuatnya berfungsi. Jika Anda menggunakan System.Windows.Forms, misalnya, aplikasi tidak akan berfungsi tanpa dimodifikasi. Demikian juga jika Anda menggunakan kode khusus Windows (kode akses registri, misalnya). Tapi saya pikir pelaku terburuk adalah kode UI. Itu sangat buruk pada sistem Macintosh.

TheSmurf
sumber
4

Kami telah menggunakannya untuk proyek di sini di tempat kerja yang perlu dijalankan di Linux tetapi menggunakan kembali beberapa .NET librari yang kami bangun di Managed C ++. Saya sangat terkejut betapa berhasilnya hal itu. Eksekusi utama kami sedang ditulis dalam C # dan kami bisa mereferensikan binari C ++ yang Dikelola kami tanpa masalah. Satu-satunya perbedaan dalam kode C # antara Windows dan Linux adalah kode port serial RS232.

Satu-satunya masalah besar yang bisa saya pikirkan terjadi sekitar sebulan yang lalu. Linux build memiliki kebocoran memori yang tidak terlihat pada Windows build. Setelah melakukan beberapa debugging manual (profiler dasar untuk Mono di Linux tidak banyak membantu), kami dapat mempersempit masalah menjadi beberapa bagian kode. Kami akhirnya memperbaiki solusi, tetapi saya masih perlu mencari waktu untuk kembali dan mencari tahu apa penyebab utama kebocoran itu.

Chitchcock
sumber
Jadi bagaimana Anda menulis kode untuk port serial yang menangani keduanya? Inti dari CLR / Mono adalah menjadi platform independen, bukan? Apakah ini dilakukan dalam file konfigurasi?
Tim
2

Apakah Anda tahu seberapa baik dukungan preview Mono 2.0 untuk Windows Forms 2.0?

Dari sedikit yang saya mainkan dengannya, sepertinya relatif lengkap dan hampir bisa digunakan. Hanya saja tidak terlihat benar di beberapa tempat dan masih sedikit hit atau miss secara keseluruhan. Sungguh mengherankan saya bahwa itu bekerja sama baiknya dengan beberapa bentuk kami, meskipun jujur.

jsight
sumber
2

Ya itu pasti (jika Anda berhati-hati) Kami mendukung Mono di Ra-Ajax (perpustakaan Ajax ditemukan di http://ra-ajax.org ) dan kami sebagian besar tidak mengalami masalah sama sekali. Anda perlu berhati-hati dengan beberapa "hal paling gila" dari .Net seperti WSE dll, dan mungkin juga beberapa proyek Anda yang ada tidak akan 100% kompatibel dengan Mono, tetapi proyek baru jika Anda mengujinya selama pengembangan sebagian besar akan kompatibel tanpa masalah dengan Mono. Dan keuntungan dari mendukung Linux dll melalui penggunaan Mono sangat keren;)

Sebagian besar dari rahasia mendukung Mono saya pikir adalah menggunakan alat yang tepat dari awal, misalnya ActiveRecord, log4net, ra-ajax dll ...

Thomas Hansen
sumber
2

Untuk jenis aplikasi yang sedang kami bangun, Mono tampaknya tidak siap untuk diproduksi. Kami terkesan dengan keseluruhannya, dan terkesan dengan kinerjanya baik pada Windows maupun pada mesin EC2, namun, program kami macet secara konsisten dengan kesalahan pengumpulan sampah pada Windows dan linux.

Pesan kesalahannya adalah: "kesalahan fatal di GC: terlalu banyak bagian tumpukan", di sini ada tautan ke orang lain yang mengalami masalah dengan cara yang sedikit berbeda:

http://bugzilla.novell.com/show_bug.cgi?id=435906

Sepotong kode pertama yang kami jalankan di Mono adalah tantangan pemrograman sederhana yang kami kembangkan ... Kode memuat sekitar 10mb data ke dalam beberapa struktur data (mis. HashSets), kemudian menjalankan 10 kueri terhadap data. Kami menjalankan kueri 100 kali untuk menghitung waktu dan mendapatkan rata-rata.

Kode mogok sekitar kueri ke-55 di Windows. Di linux itu bekerja, tapi begitu kami pindah ke kumpulan data yang lebih besar, itu akan crash juga.

Kode ini sangat sederhana, misalnya memasukkan beberapa data ke dalam HashSets dan kemudian meminta mereka HashSets dll, semua asli c #, tidak ada yang tidak aman, tidak ada panggilan API. Pada Microsoft CLR tidak pernah crash, dan berjalan pada set data besar 1000 kali baik-baik saja.

Salah satu orang kami mengirim email ke Miguel dan memasukkan kode yang menyebabkan masalah, belum ada tanggapan. :(

Tampaknya juga banyak orang lain telah mengalami masalah ini tanpa solusi - satu solusi telah disarankan untuk mengkompilasi ulang Mono dengan pengaturan GC yang berbeda tetapi itu hanya tampaknya meningkatkan ambang sebelum crash.


sumber
9
Bugzilla adalah tempat untuk melaporkan bug: Miguel sangat sibuk dan tidak ada yang bisa mengikuti semua orang yang mengirimnya laporan bug individual. Jika Anda tidak dapat menerbitkan kode sampel, Anda masih harus melaporkan masalah dalam bugzilla dan perhatikan bahwa Anda mengirim sampel ke Miguel atau saya ([email protected]).
lupus
2

Cukup periksa www.plasticscm.com. Semuanya (klien, server, GUI, alat gabungan) ditulis pada mono.


sumber
1

Itu benar-benar tergantung pada ruang nama dan kelas yang Anda gunakan dari .NET framework. Saya tertarik mengonversi salah satu layanan windows saya untuk berjalan di server email saya, yaitu Suse, tetapi kami mengalami beberapa hambatan keras dengan API yang belum sepenuhnya diimplementasikan. Ada grafik di suatu tempat di situs web Mono yang mencantumkan semua kelas dan tingkat penyelesaiannya. Jika aplikasi Anda dicakup, maka lakukanlah.

Seperti aplikasi lainnya, lakukan prototipe dan pengujian sebelum Anda membuat komitmen penuh, tentu saja.

Masalah lain yang kami temui adalah perangkat lunak berlisensi: jika Anda mereferensikan DLL orang lain, Anda tidak dapat membuat kode jalan di sekitar ketidakcocokan yang terkubur dalam perakitan itu.

Eric Z Beard
sumber
1

Tidak, mono tidak siap untuk pekerjaan serius. Saya menulis beberapa program di Windows menggunakan F # dan menjalankannya di Mono. Program-program itu menggunakan disk, memori, dan CPU dengan cukup intensif. Saya melihat crash di perpustakaan mono (dikelola kode), crash dalam kode asli dan crash di mesin virtual. Ketika mono bekerja program setidaknya dua kali lebih lambat daripada di. Net di Windows dan menggunakan lebih banyak memori. Jauhi mono untuk pekerjaan serius.

Stefan
sumber
4
Ini adalah bukti anekdotal yang disajikan sebagai fakta dan muncul di
hadapan
Sebenarnya ASP.NET bisa lebih cepat berjalan di bawah nginx / fast-cgi daripada di IIS. Semuanya tergantung pada bagian mana dari kerangka kerja porting / teruji dengan baik: mono-project.com/Compatibility . Harus setuju dengan @Firegrass.
Rui Marques
1
Ini adalah pengalaman pribadi seseorang yang disajikan seperti itu. Dengan pengecualian awalan dengan "Saya pikir" itu adalah kontribusi yang valid untuk diskusi ini.
Amir Abiri