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?
.net
open-source
mono
wvdschel
sumber
sumber
Jawaban:
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.
sumber
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:
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 .
sumber
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:
Path.Separator
alih-alih hardcoding"\"
, juga gunakanEnvironment.NewLine
sebagai ganti"\n"
.sumber
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:
Once / Selama mendapatkan barang-barang Anda sebenarnya DIBANGUN, Anda mungkin melihat beberapa hutan belantara bahkan untuk kode yang HARUS didukung seperti:
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.
sumber
Rekomendasi untuk jawaban yang diterima agak ketinggalan zaman sekarang.
sumber
Jika Anda ingin menggunakan WPF Anda kurang beruntung Mono saat ini tidak memiliki rencana untuk mengimplementasikannya.
http://www.mono-project.com/WPF
sumber
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:
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:
Seperti disebutkan di atas, sgen gc tidak berfungsi (mono dibangun dari sumber):
Adapun boehm segfauls - misalnya (Ubuntu 13.04, mono built from source):
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 )
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.
sumber
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.)
sumber
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.
sumber
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.
sumber
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.
sumber
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 ...
sumber
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
Cukup periksa www.plasticscm.com. Semuanya (klien, server, GUI, alat gabungan) ditulis pada mono.
sumber
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.
sumber
Saya akan membayangkan jika Anda memiliki aplikasi dengan beberapa komponen pihak ke-3, Anda mungkin diisi. Saya ragu banyak vendor akan berkembang dengan mempertimbangkan Mono
Contoh: http://community.devexpress.com/forums/p/55085/185853.aspx
sumber
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.
sumber