Mono는 황금 시간대에 준비되어 있습니다.

.net open-source mono


대규모 또는 중형 프로젝트에서 오픈 소스 .NET 구현 인 Mono를 사용한 사람이 있습니까? 실제 프로덕션 환경에서 사용할 준비가되었는지 궁금합니다. 안정적이고 빠르며 호환이 가능한가요? ... 사용하기에 충분합니까? 프로젝트를 Mono 런타임으로 포팅하는 데 많은 노력이 필요합니까, 아니면 Microsoft 런타임 용으로 이미 작성된 코드를 가져 와서 실행할 수있을 정도로 실제로 호환됩니까?




Answer 1 miguel.de.icaza


고려해야 할 몇 가지 시나리오가 있습니다. (a) 기존 애플리케이션을 포팅하고 Mono가이 작업에 충분한 지 궁금한 경우; (b) 새로운 코드를 작성하기 시작했으며 Mono가 충분히 성숙했는지 알고 싶습니다.

첫 번째 경우에는 Mono Migration Analyzer 도구 (Moma)를 사용하여 애플리케이션이 Mono에서 실행되는 거리를 평가할 수 있습니다. 평가 결과가 색상으로 돌아 오면 테스트 및 QA를 시작하고 배송 준비를해야합니다.

Mono에서 누락되거나 의미 체계가 크게 다른 기능을 강조하는 보고서가 평가로 돌아 오면 코드를 조정할 수 있는지, 재 작성할 수 있는지 또는 최악의 경우 애플리케이션이 제한된 기능으로 작동 할 수 있는지 여부를 평가해야합니다.

사용자 제출 (메모리에서 가져온 것임)을 기반으로 한 Moma 통계에 따르면 약 50 %의 애플리케이션이 즉시 작동하고, 약 25 %는 약 1 주일 분량의 작업 (리팩토링, 적응)이 필요하며 15 %는 코드 청크를 다시 실행하고 나머지는 Win32에 매우 묶여 있기 때문에 포팅을 귀찮게 할 가치가 없습니다. 이 시점에서 0에서 시작하거나 비즈니스 결정이 코드를 이식 가능하게 만드는 노력을 주도하지만 우리는 최소한 우리가 가지고있는 보고서에서 몇 달 동안 작업 할 가치가 있습니다.

처음부터 시작하는 경우 Mono에있는 API 만 사용하기 때문에 상황이 훨씬 간단합니다. 지원되는 스택 (대부분의 .NET 2.0과 LINQ 및 System.Core, Mono 크로스 플랫폼 API를 포함한 3.5의 모든 핵심 업그레이드)을 유지하는 한 괜찮습니다.

가끔씩 Mono의 버그 나 제한 사항에 부딪 힐 수 있으며 해결해야 할 수도 있지만 다른 시스템과 다르지 않습니다.

이식성에 관해서 : ASP.NET 응용 프로그램은 Win32에 대한 종속성이 거의 또는 전혀 없으며 SQL 서버 또는 기타 인기있는 데이터베이스를 사용할 수도 있으므로 이식하기가 더 쉽습니다 (Mono와 함께 번들로 제공되는 데이터베이스 공급자가 많이 있음).

Windows.Forms 포팅은 때때로 더 까다로울 수 있습니다. 개발자는 .NET 샌드 박스를 벗어나서 P / Invoke를 사용하여 wParam에 BCD 형식으로 인코딩 된 두 개의 베 지어 포인트로 표현되는 커서 깜박임 속도를 변경하는 것만 큼 유용한 기능을 구성하기 때문입니다. 아니면 그런 쓰레기.




Answer 2 Jon Galloway


.NET 4.0까지 매우 광범위하고 .NET 4.5 API의 일부 기능도 포함하지만 API가 더 이상 사용되지 않거나 새로운 대안이 생성되거나 범위가 너무 커서 구현하지 않기로 선택한 몇 가지 영역이 있습니다. 큰. 다음 API는 Mono에서 사용할 수 없습니다.

  • Windows Presentation Foundation
  • Windows Workflow Foundation (두 버전 모두 아님)
  • Entity Framework
  • 표준 웹 서비스 스택에 대한 WSE1 / WSE2 "추가 기능"

또한 WCF 구현은 Silverlight가 지원하는 것으로 제한됩니다.

특정 프로젝트를 확인하는 가장 쉬운 방법은 모노 마이그레이션 분석기 (MoMA) 를 실행하는 것 입니다. 장점은 Mono 팀에 Mono (있는 경우)를 사용하지 못하게하는 문제를 알리고 작업의 우선 순위를 지정할 수 있다는 것입니다.

최근에 SubSonic에서 MoMA를 실행했는데 Nullable 유형의 이상한 사용이라는 한 가지 문제 만 발견되었습니다. 그것은 큰 코드베이스이므로 거기에 대한 범위는 꽤 인상적이었습니다.

Mono는 여러 상용 및 오픈 소스 제품 에서 활발히 사용되고 있습니다 . Wikipedia 및 Mozilla 개발자 센터와 같은 일부 대규모 응용 프로그램에서 사용 중이며 Sansa MP3 플레이어와 같은 임베디드 응용 프로그램에서 사용되었으며 수천 개의 게시 된 게임을 지원합니다.

언어 수준 에서 Mono 컴파일러는 C # 5.0 언어 사양을 완전히 준수합니다 .




Answer 3 FlySwat


데스크톱 측면에서 Mono는 GTK #을 사용하는 경우 훌륭하게 작동합니다. Windows.Forms 구현은 여전히 ​​약간 버그가 있지만 (예 : TrayIcon은 작동하지 않음) 먼 길을 왔습니다. 게다가 GTK #은 Windows Forms보다 더 나은 툴킷입니다.

웹 측면에서 Mono는 대부분의 사이트를 완벽하게 실행하기에 충분한 ASP.NET을 구현했습니다. 여기서 어려운 점은 아파치에 mod_mono가 설치된 호스트를 찾거나 호스트에 대한 쉘 액세스 권한이있는 경우 직접 수행하는 것입니다.

어느 쪽이든 Mono는 훌륭하고 안정적입니다.

크로스 플랫폼 프로그램을 만들 때 기억해야 할 주요 사항 :

  • Windows.Forms 대신 GTK # 사용
  • 파일 이름의 대소 문자를 올바르게 지정하십시오.
  • 사용 Path.Separator 는 대신 하드 코딩 "\" 도 사용 Environment.NewLine 를 대신 "\n" .
  • Win32 API에 대한 P / Invoked 호출을 사용하지 마십시오.
  • Windows 레지스트리를 사용하지 마십시오.



Answer 4 damageboy


저는 개인적으로 황금 시간대에서 Mono를 사용합니다. 저는 기가 바이트의 udp / tcp 데이터 처리 관련 작업을 처리하는 모노 서버를 실행하고 있으며 더 이상 행복 할 수 없습니다.

특이한 점이 있으며 가장 성가신 것 중 하나는 Mono의 현재 상태로 인해 msbuild 파일을 "빌드"할 수 없다는 것입니다.

  • MonoDevelop (IDE)에는 부분적인 msbuild 지원이 있지만 기본적으로 간단한 hello-world (사용자 정의 빌드 작업, $ (SolutionDir)와 같은 동적 "속성", 몇 가지 죽은 이름을 지정하는 실제 구성을 넘어선 모든 "REAL"빌드 구성에 지루함) -끝)
  • xbuild 되어 있어야 모노 - 공급 - msbuild를-완벽하게 호환 빌드 시스템은 실제로 그렇게 명령 줄에서 구축의 매우 "정통"상태 인 GUI를 사용하는 것보다 더 나쁜 경험을 더욱 끔찍한입니다 Linux 환경 용 union ...

한 번 / 실제로 물건을 만드는 동안 다음과 같이 지원되어야하는 코드에 대해서도 일부 황야를 볼 수 있습니다.

  • 컴파일러가 특정 구조에 지루함
  • 예상치 못한 쓰레기를 던지는 특정 고급 / 새로운 .NET 클래스 (XLinq 누구?)
  • 미성숙 한 런타임 "기능"(x64에서 3GB 힙 제한 ... WTF!)

그러나 Heaving은 일반적으로 말하는 것이 매우 빠르게 작동하기 시작하고 솔루션 / 해결 방법이 풍부하다고 말했습니다 .

이러한 초기 장애물을 극복하면 내 경험은 모노 ROCKS이며 반복 할 때마다 계속 나아지고 있습니다.

저는 모노로 실행되는 서버를 가지고 있고, 하루에 300GB의 데이터를 처리하고, 수많은 p / invoke를 처리하고, 일반적으로 "블리딩 엣지"모노를 사용해도 많은 작업을 수행하고 5-6 개월 동안 UP 상태를 유지했습니다.

도움이 되었기를 바랍니다.




Answer 5 Kris Erickson


허용되는 답변에 대한 권장 사항은 현재 약간 구식입니다.

  • Windows Forms 구현은 이제 꽤 좋습니다. ( 매우 관련된 Windows Forms 응용 프로그램 인 Paint.net의 포트에 대해서는 Paint-Mono 를 참조하십시오 . 필요한 것은 일부 P-Invoke 및 지원되지 않는 시스템 호출에 대한 에뮬레이션 레이어뿐이었습니다.)
  • Path.Combine 및 Path.Seperator는 경로와 파일 이름을 결합합니다.
  • Windows 레지스트리는 응용 프로그램에서 데이터를 저장하고 검색하는 데만 사용하는 한 괜찮습니다 (기본적으로 Mono 응용 프로그램의 레지스트리이므로 Windows에 대한 정보를 얻을 수 없음).