Czy ktoś używał Mono, otwartej implementacji .NET w dużym lub średnim projekcie? Zastanawiam się, czy jest gotowy na rzeczywiste środowiska produkcyjne. Czy jest stabilny, szybki, kompatybilny ... wystarczający do użycia? Czy przeniesienie projektów do środowiska wykonawczego Mono wymaga dużo wysiłku, czy też jest naprawdę wystarczająco kompatybilne, aby po prostu pobrać i uruchomić już napisany kod środowiska wykonawczego Microsoft?
.net
open-source
mono
wvdschel
źródło
źródło
Odpowiedzi:
Należy wziąć pod uwagę kilka scenariuszy: (a) jeśli przenosisz istniejącą aplikację i zastanawiasz się, czy Mono jest wystarczająco dobry do tego zadania; (b) zaczynasz pisać nowy kod i chcesz wiedzieć, czy Mono jest wystarczająco dojrzały.
W pierwszym przypadku możesz użyć narzędzia Mono Migration Analyzer (Moma), aby ocenić, jak daleko Twoja aplikacja jest uruchomiona na Mono. Jeśli ocena powróci z jaskrawymi kolorami, powinieneś zacząć od testowania i kontroli jakości i przygotować się do wysyłki.
Jeśli twoja ocena wróci z raportem podkreślającym brakujące funkcje lub znacznie różniącymi się ich semantyką w Mono, będziesz musiał ocenić, czy kod może zostać dostosowany, przepisany lub, w najgorszym przypadku, czy Twoja aplikacja może działać ze zmniejszoną funkcjonalnością.
Według naszych statystyk Moma opartych na zgłoszeniach użytkowników (pochodzi z pamięci) około 50% aplikacji działa od razu po wyjęciu z pudełka, około 25% wymaga około tygodnia pracy (refaktoryzacja, dostosowanie), kolejne 15% wymaga poważnego zaangażowania w przerabiaj fragmenty kodu, a reszta nie jest po prostu warta kłopotania się z portowaniem, ponieważ są one tak niesamowicie powiązane z Win32. W tym momencie albo zaczynasz od zera, albo decyzja biznesowa zwiększy wysiłek, aby twój kod był przenośny, ale mówimy o pracy wartej miesięcy (przynajmniej z raportów, które mamy).
Jeśli zaczynasz od zera, sytuacja jest o wiele prostsza, ponieważ będziesz używać tylko interfejsów API obecnych w Mono. Tak długo, jak pozostaniesz przy obsługiwanym stosie (który jest właściwie .NET 2.0, plus wszystkie podstawowe aktualizacje 3.5, w tym LINQ i System.Core, a także dowolne interfejsy API między platformami Mono), wszystko będzie dobrze.
Co jakiś czas możesz napotykać błędy w trybie mono lub ograniczenia i być może będziesz musiał je obejść, ale nie różni się to od żadnego innego systemu.
Jeśli chodzi o przenośność: aplikacje ASP.NET są łatwiejsze do przeniesienia, ponieważ te mają niewielką lub żadną zależność od Win32, a nawet można używać serwera SQL lub innych popularnych baz danych (istnieje wiele dostawców baz danych w pakiecie z Mono).
Przenoszenie Windows.Forms jest czasem trudniejsze, ponieważ programiści lubią uciec z piaskownicy .NET i P / wywołują mózgi, aby skonfigurować rzeczy tak przydatne, jak zmiana częstotliwości migania kursora wyrażonej jako dwa punkty Béziera zakodowane w postaci BCD w wParam. Lub jakieś takie śmieci.
źródło
Ma dość obszerny zasięg do .NET 4.0, a nawet zawiera niektóre funkcje z interfejsów API .NET 4.5, ale jest kilka obszarów, których zdecydowaliśmy się nie wdrażać z powodu przestarzałych interfejsów API, tworzenia nowych alternatyw lub zbyt dużego zakresu duży. Następujące interfejsy API nie są dostępne w trybie Mono:
Ponadto nasza implementacja WCF jest ograniczona do obsługiwanego przez Silverlight.
Najłatwiejszym sposobem sprawdzenia określonego projektu jest uruchomienie Mono Migration Analyzer (MoMA) . Korzyścią jest to, że powiadomi zespół Mono o problemach, które uniemożliwiają korzystanie z Mono (jeśli w ogóle), co pozwala im ustalić priorytet swojej pracy.
Niedawno uruchomiłem MoMA na SubSonic i znalazłem tylko jeden problem - dziwne użycie typów Nullable. To duża baza kodów, więc zasięg był imponujący.
Mono jest aktywnie wykorzystywane w wielu produktach komercyjnych i open source . Jest używany w niektórych dużych aplikacjach, takich jak Wikipedia i Mozilla Developer Center , i był używany w aplikacjach wbudowanych, takich jak odtwarzacze MP3 Sansa, i obsługuje tysiące opublikowanych gier.
Na poziomie językowym kompilator Mono jest w pełni zgodny ze specyfikacją języka C # 5.0 .
źródło
Po stronie komputera Mono działa świetnie, jeśli zdecydujesz się na użycie GTK #. Implementacja Windows.Forms wciąż jest trochę wadliwa (na przykład TrayIcon nie działa), ale przeszła długą drogę. Poza tym GTK # jest lepszym zestawem narzędzi niż Windows Forms.
Po stronie internetowej, Mono zaimplementowało wystarczająco dużo platformy ASP.NET, aby doskonale uruchomić większość stron. Trudność polega na tym, aby znaleźć hosta, który ma mod_mono zainstalowany na Apache, lub zrobić to sam, jeśli masz dostęp do powłoki z hosta.
Tak czy inaczej, Mono jest świetny i stabilny.
Najważniejsze rzeczy do zapamiętania podczas tworzenia programu międzyplatformowego:
Path.Separator
zamiast na stałe"\"
, użyj takżeEnvironment.NewLine
zamiast"\n"
.źródło
Ja osobiście używam Mono w env w prime-time. Prowadzę serwery mono zajmujące się gigabajtami zadań związanych z przetwarzaniem danych udp / tcp i nie może być szczęśliwszy.
Istnieją osobliwości, a jedną z najbardziej irytujących rzeczy jest to, że nie można po prostu „zbudować” plików msbuild ze względu na obecny stan Mono:
Raz / w trakcie faktycznego budowania twoich rzeczy, możesz zobaczyć dzikie sekrety, nawet dla kodu, który POWINNO być obsługiwany, jak:
ale falujący powiedział, że ogólnie rzecz biorąc rzeczy zaczynają działać bardzo szybko, a rozwiązania / obejścia są obfite .
Po przejściu przez te początkowe przeszkody, moje doświadczenie jest takie, że mono ROCKS i staje się coraz lepsze z każdą iteracją .
Mam serwery działające w trybie mono, przetwarzające 300 GB danych dziennie, z tonami p / wywołań i ogólnie mówiąc, wykonują DUŻO pracy i pozostają w gotowości przez 5-6 miesięcy, nawet przy „krwawej mono”.
Mam nadzieję że to pomoże.
źródło
Zalecenia dotyczące przyjętej odpowiedzi są już trochę nieaktualne.
źródło
Jeśli chcesz korzystać z WPF, nie masz szczęścia Mono obecnie nie planuje go wdrożyć.
http://www.mono-project.com/WPF
źródło
Cóż, mono jest świetne, ale o ile widzę, jest niestabilne. Działa, ale powoduje błędy, gdy proces monofoniczny wymaga poważnej pracy.
TL; DR - Nie używaj mono, jeśli:
Więc fakty.
Używamy mono-2.6.7 (.net v 3.5) na RHEL5, Ubuntu i, z mojego punktu widzenia, jest to najbardziej stabilna wersja zbudowana przez Novell. Ma problem z rozładowaniem AppDomains (segfaults), jednak zawiesza się bardzo rzadko i jest to zdecydowanie dopuszczalne (przez nas).
W porządku. Ale jeśli chcesz korzystać z funkcji .net 4.0, musisz przełączyć się do wersji 2.10.x lub 3.x i tam zaczynają się problemy.
W porównaniu z wersją 2.6.7 nowe wersje są po prostu niedopuszczalne. Napisałem prostą aplikację do testów warunków skrajnych do testowania instalacji mono.
Jest tutaj, z instrukcją użycia: https://github.com/head-thrash/stress_test_mono
Używa wątków roboczych puli wątków. Pracownik ładuje bibliotekę DLL do AppDomain i próbuje wykonać pracę matematyczną. Część pracy jest wielowątkowa, część pojedyncza. Prawie cała praca jest związana z procesorem, chociaż niektóre odczyty plików z dysku.
Wyniki nie są bardzo dobre. W rzeczywistości dla wersji 3.0.12:
Jak wspomniano powyżej, sgen gc po prostu nie działa (mono zbudowany ze źródła):
Jeśli chodzi o boehm segfauls - na przykład (Ubuntu 13.04, mono zbudowany ze źródła):
Lub (RHEL5, mono jest pobierane z rpm tutaj ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home%3A/vmas%3A/mono-centos5 )
Obie awarie są w jakiś sposób powiązane z logiką AppDomains, więc powinieneś trzymać się od nich z daleka w mono.
BTW, testowany program pracował bez żadnych problemów 24 godziny na komputerze z systemem Windows w MS .NET 4.5 env.
Podsumowując, chciałbym powiedzieć - ostrożnie używaj mono. Działa od pierwszego spojrzenia, ale może łatwo zawieść za każdym razem. Pozostanie ci kilka podstawowych zrzutów i poważna utrata wiary w projekty typu open source.
źródło
MoMA jest świetnym narzędziem do tego, jak sugerował ktoś inny. Największymi źródłami niezgodności są obecnie aplikacje, które DllImport (lub P / Invoke) do bibliotek Win32. Niektóre zestawy nie są zaimplementowane, ale większość z nich jest przeznaczona tylko dla systemu Windows i naprawdę nie miałaby sensu w systemie Linux. Myślę, że dość bezpiecznie jest powiedzieć, że większość aplikacji ASP.NET może działać na Mono z ograniczonymi modyfikacjami.
(Ujawnienie: Przyczyniłem się do samego Mono, a także do napisanych aplikacji, które działają na nim.)
źródło
W wielu przypadkach możesz pobrać istniejący kod i po prostu uruchomić go na Mono, szczególnie jeśli portujesz aplikację ASP.NET.
W niektórych przypadkach możesz potrzebować zupełnie nowych sekcji kodu, aby działał. Jeśli na przykład używasz System.Windows.Forms, aplikacja nie będzie działać bez modyfikacji. Podobnie jeśli używasz kodu specyficznego dla systemu Windows (na przykład kod dostępu do rejestru). Ale myślę, że najgorszym przestępcą jest kod interfejsu użytkownika. Jest to szczególnie złe w systemach Macintosh.
źródło
Używaliśmy go do pracującego tutaj projektu, który musiał działać w systemie Linux, ale wykorzystał ponownie niektóre biblioteki .NET, które zbudowaliśmy w Managed C ++. Byłem bardzo zaskoczony, jak dobrze się udało. Nasz główny plik wykonywalny jest napisany w języku C # i możemy bez problemu odwoływać się do naszych plików binarnych Managed C ++. Jedyną różnicą w kodzie C # między Windows a Linuksem jest kod portu szeregowego RS232.
Jedyny duży problem, o którym mogę pomyśleć, wydarzył się około miesiąca temu. Kompilacja Linuksa miała wyciek pamięci, którego nie widać w kompilacji Windows. Po ręcznym debugowaniu (podstawowe profile dla Mono w Linuksie niewiele pomogły), byliśmy w stanie zawęzić problem do określonej części kodu. Skończyło się załatanie obejścia, ale wciąż muszę znaleźć trochę czasu, aby wrócić i dowiedzieć się, jaka była pierwotna przyczyna wycieku.
źródło
Z tego, z czym się bawiłem, wydawało się, że jest stosunkowo kompletny i prawie użyteczny. Po prostu nie wyglądało to dobrze w niektórych miejscach i wciąż jest trochę hitem lub chybił. Zadziwiło mnie, że działało tak samo dobrze, jak w przypadku niektórych naszych form, choć szczerze.
źródło
Tak, to zdecydowanie tak (jeśli jesteś ostrożny) Wspieramy Mono w Ra-Ajax (biblioteka Ajax znajduje się na stronie http://ra-ajax.org ) i przeważnie nie mamy żadnych problemów. Musisz być ostrożny z niektórymi „najbardziej szalonymi rzeczami” z .Net, takimi jak GPW itp., A także prawdopodobnie kilka z twoich istniejących projektów nie będzie w 100% kompatybilnych z Mono, ale nowe projekty, jeśli przetestujesz je podczas programowania, będą głównie być kompatybilnym bez problemów z Mono. A korzyść ze wsparcia Linuksa itp. Za pomocą Mono jest naprawdę świetna;)
Duża część sekretu obsługi Mono, myślę, że od samego początku używa odpowiednich narzędzi, np. ActiveRecord, log4net, ra-ajax itp.
źródło
Dla tego typu aplikacji, którą budujemy, Mono niestety nie wydaje się gotowe do produkcji. Byliśmy pod wrażeniem tego wszystkiego i byliśmy pod wrażeniem jego wydajności zarówno w systemie Windows, jak i na komputerach EC2, jednak nasz program konsekwentnie powodował awarie związane z odśmiecaniem pamięci w systemie Windows i Linux.
Komunikat o błędzie brzmi: „krytyczne błędy w GC: zbyt wiele sekcji sterty”, oto link do kogoś, kto doświadcza problemu w nieco inny sposób:
http://bugzilla.novell.com/show_bug.cgi?id=435906
Pierwszy kawałek kodu, który uruchomiliśmy w Mono, to proste wyzwanie programistyczne, które opracowaliśmy ... Kod ładuje około 10 MB danych do niektórych struktur danych (np. HashSets), a następnie uruchamia 10 zapytań względem danych. Uruchomiliśmy zapytania 100 razy, aby je ustalić i uzyskać średnią.
Kod zawiesił się wokół 55. zapytania w systemie Windows. Na Linuksie działało, ale jak tylko przenieśliśmy się do większego zestawu danych, również się zawiesił.
Ten kod jest bardzo prosty, np. Umieść niektóre dane w HashSets, a następnie zapytaj o te HashSets itp., Wszystkie natywne c #, nic niebezpiecznego, brak wywołań API. Na Microsoft CLR nigdy się nie zawiesza i działa na ogromnych zestawach danych 1000 razy w porządku.
Jeden z naszych facetów przesłał Miguelowi wiadomość e-mail i podał kod, który spowodował problem, na razie brak odpowiedzi. :(
Wydaje się również, że wiele innych osób napotkało ten problem bez rozwiązania - zaproponowano jedno rozwiązanie, aby ponownie skompilować Mono z różnymi ustawieniami GC, ale wydaje się, że po prostu zwiększa próg, przed którym się zawiesza.
źródło
Wystarczy sprawdzić www.plasticscm.com. Wszystko (klient, serwer, GUI, narzędzia do scalania) jest napisane mono.
źródło
To naprawdę zależy od przestrzeni nazw i klas, których używasz ze środowiska .NET. Chciałem przekonwertować jedną z moich usług Windows do działania na moim serwerze pocztowym, którym jest Suse, ale natrafiliśmy na kilka twardych blokad z interfejsami API, które nie zostały w pełni zaimplementowane. Gdzieś na stronie Mono znajduje się tabela, która zawiera listę wszystkich klas i ich poziomu ukończenia. Jeśli Twoja aplikacja jest objęta ubezpieczeniem, wybierz ją.
Oczywiście, podobnie jak w przypadku każdej innej aplikacji, wykonaj prototypowanie i testy, zanim podejmiesz pełne zaangażowanie.
Innym problemem, na który natrafiliśmy, jest licencjonowane oprogramowanie: jeśli odwołujesz się do cudzej biblioteki DLL, nie możesz kodować obejścia niezgodności zakopanych w tym zestawie.
źródło
Wyobrażam sobie wtedy, że jeśli masz aplikację z niektórymi komponentami innych firm, możesz być wypchany. Wątpię, aby wielu sprzedawców rozwijało się z myślą o Mono
Przykład: http://community.devexpress.com/forums/p/55085/185853.aspx
źródło
Nie, mono nie jest gotowe do poważnej pracy. Napisałem kilka programów w systemie Windows przy użyciu F # i uruchomiłem je na Mono. Te programy dość intensywnie wykorzystywały dysk, pamięć i procesor. Widziałem awarie w bibliotekach mono (kod zarządzany), awarie w natywnym kodzie i awarie na maszynie wirtualnej. Kiedy mono działało, programy były co najmniej dwa razy wolniejsze niż w .Net w Windows i zużywały znacznie więcej pamięci. Trzymaj się z dala od mono za poważną pracę.
źródło