Mono ใช้บ่อยครั้งในการพูดว่า“ ใช่แล้ว. NET คือแพลตฟอร์มข้าม” การอ้างสิทธิ์นั้นถูกต้องแค่ไหน? [ปิด]


168

ในสิ่งที่คุณจะเลือกสำหรับโครงการของคุณระหว่าง. NET และ Java ณ จุดนี้ในเวลา? ฉันบอกว่าฉันจะพิจารณา "คุณจะใช้งานกับ Windows หรือไม่" การตัดสินใจทางเทคนิคที่สำคัญที่สุดเพียงครั้งเดียวในการสร้างโครงการเว็บใหม่และหากคำตอบคือ "ไม่" ฉันจะแนะนำ Java แทน. NET

ข้อโต้แย้งทั่วไปที่พบบ่อยคือ "ถ้าเราต้องการรันบน Linux / OS X / อะไรก็ตามเราจะเรียกใช้ Mono" 1ซึ่งเป็นข้อโต้แย้งที่น่าสนใจมากบนพื้นผิว แต่ฉันไม่เห็นด้วยกับหลาย ๆ เหตุผล

  • OpenJDK และผู้จัดจำหน่ายทั้งหมดที่จัดหาให้ JVM ได้ผ่าน Sun TCK อย่างเป็นทางการเพื่อให้แน่ใจว่าสิ่งต่าง ๆ ทำงานได้อย่างถูกต้อง ฉันไม่ทราบว่า Mono ผ่าน Microsoft TCK
  • Mono นำเสนอ. NET ปัจจุบันระดับของ. NET รองรับอะไรบ้าง
  • องค์ประกอบ GUI (WinForms ทั้งหมด) ทำงานอย่างถูกต้องใน Mono หรือไม่
  • ธุรกิจอาจไม่ต้องการพึ่งพากรอบโอเพนซอร์ซตามแผนอย่างเป็นทางการบี

ฉันรู้ว่าด้วยการกำกับดูแลใหม่ของ Java โดย Oracle อนาคตไม่ปลอดภัย แต่เช่นIBM ให้ JDK สำหรับแพลตฟอร์มหลายแห่งรวมถึง Linux พวกเขาไม่ได้เปิดแหล่งที่มา

ดังนั้นภายใต้สถานการณ์ใด Mono เป็นกลยุทธ์ทางธุรกิจที่ถูกต้องสำหรับ. NET-applications?


1 Mark H สรุปว่า : "ถ้าการอ้างสิทธิ์คือ" ฉันมีแอปพลิเคชัน windows ที่เขียนใน. NET มันควรทำงานแบบโมโน "ไม่ใช่แล้วมันไม่ใช่การเรียกร้องที่ถูกต้อง - แต่ Mono ได้พยายามทำพอร์ตแอปพลิเคชันดังกล่าว ง่าย."



24
เพียงเพื่อให้ชัดเจน. NET คือการใช้งานของ Microsoft ของ CLI Mono เป็นการนำ CLI ไปใช้โดยมี Novell เป็นผู้นำ
ChaosPandion

ฟังดูคล้ายกับคำตอบของคำถามก่อนหน้ามากกว่าคำถามที่อยู่ในตัวของมันเอง ฉันขอแนะนำให้คุณพิจารณาแก้ไขคำถามของคุณเพื่อให้คำถามนั้นมีความเป็นตัวของตัวเองมากขึ้น
วอลเตอร์

2
@walter จุดทั้งหมดคือฉันรู้ว่า "java เป็นข้ามแพลตฟอร์มมากกว่า. NET" มากกว่าปกติ - อาร์กิวเมนต์และฉันแสดงรายการเหล่านั้นเพื่อให้คำตอบรวมอาร์กิวเมนต์ที่ดีที่สุดที่เป็นไปได้

1
นี่ไม่ใช่หัวข้อสำหรับคำถาม ตรงไปที่ไซต์การวางแผนธุรกิจและเรียกดูตัวอย่างแผนบางอย่างเพื่อดูว่าอะไรที่สำคัญอย่างแท้จริงสำหรับธุรกิจ ... Tech X vs Tech Y มีความสำคัญเท่ากับ FedEx โตโยต้าโต้วาทีกับ Ford และ GM สำหรับการส่งมอบรถตู้
ดินสีแดง

คำตอบ:


194

คำตอบของ Sparkie เข้าใจแล้วขอผมเติมเต็มหน่อย

". NET is cross platform" เป็นคำสั่งที่คลุมเครือมากเกินไปเนื่องจากทั้งเฟรมเวิร์กและโลกที่สร้างขึ้นมาเพื่อการเปลี่ยนแปลงและพัฒนา

คำตอบสั้น ๆ คือ:

เอนจิ้นพื้นฐานที่ใช้. NET และอนุพันธ์ของมันคือ Common Language Infrastructure Standard คือข้ามแพลตฟอร์มและหากคุณต้องการให้โค้ดของคุณไปหลายแพลตฟอร์มคุณต้องวางแผนในการใช้ API ที่เหมาะสมบนแพลตฟอร์มที่เหมาะสมในการส่งมอบ ประสบการณ์ที่ดีที่สุดในแต่ละแพลตฟอร์ม

ตระกูล CLI ไม่ได้ลองใช้วิธี "เขียนครั้งเดียวรันได้ทุกที่" เนื่องจากความแตกต่างจากโทรศัพท์ไปยังเมนเฟรมใหญ่เกินไป แทนที่จะเป็นเอกภพของ API และคุณสมบัติรันไทม์ที่เป็นแพลตฟอร์มเฉพาะได้เกิดขึ้นเพื่อให้นักพัฒนามีเครื่องมือที่เหมาะสมในการสร้างประสบการณ์ที่ยอดเยี่ยมในแต่ละแพลตฟอร์ม

ลองคิดดูสิ: โปรแกรมเมอร์ไม่ได้กำหนดเป้าหมายพีซี Windows หรือเซิร์ฟเวอร์ Unix อีกต่อไป โลกมากกว่าที่เคยถูกล้อมรอบด้วยแพลตฟอร์มที่น่าสนใจตั้งแต่พีซีไปจนถึงเกมคอนโซลโทรศัพท์ที่ทรงพลังกล่องรับสัญญาณไปจนถึงเซิร์ฟเวอร์ขนาดใหญ่และกลุ่มเครื่องที่กระจายตัว หนึ่งขนาดพอดีกับแพลตฟอร์มทั้งหมดเพียงจะรู้สึกป่องบนอุปกรณ์เล็ก ๆ และความรู้สึก underpowered บนระบบที่มีขนาดใหญ่

ผลิตภัณฑ์. NET Framework ของ Microsoft ไม่ได้ข้ามแพลตฟอร์ม แต่จะทำงานบน Windows เท่านั้น มี. NET Framework จาก Microsoft ที่ทำงานบนระบบอื่น ๆ เช่น Windows Phone 7, XBox360 และเบราว์เซอร์ผ่าน Silverlight แต่เป็นโปรไฟล์ที่แตกต่างกันเล็กน้อย

วันนี้คุณสามารถกำหนดเป้าหมายระบบปฏิบัติการหลัก, โทรศัพท์, อุปกรณ์พกพา, ระบบฝังตัวและเซิร์ฟเวอร์ด้วยเทคโนโลยีที่ใช้. NET นี่คือรายการที่แสดงการใช้งาน CLI ที่คุณจะใช้ในแต่ละกรณี (รายการนี้ไม่ครอบคลุม แต่ควรครอบคลุม 99% ของเคส):

  • คอมพิวเตอร์พีซีที่ใช้ x86 และ x86-64:
    • ใช้ Windows -> โดยปกติคุณเรียกใช้. NET หรือ Silverlight แต่คุณสามารถใช้โมโนแบบเต็มได้ที่นี่
    • ใช้งาน Linux, BSD หรือ Solaris -> คุณรัน Mono หรือ Silverlight แบบเต็ม
    • ใช้ MacOS X -> คุณเรียกใช้ Mono หรือ Silverlight เต็ม
    • ใช้ Android -> คุณเรียกใช้เซ็ตย่อย Mono / Android
  • คอมพิวเตอร์ ARM:
    • ใช้ Windows Phone 7: คุณเรียกใช้ Compact Framework 2010
    • ใช้ Windows 6.5 ขึ้นไป: คุณเรียกใช้ Compact Framework เก่า
    • อุปกรณ์ Android: คุณเรียกใช้ Mono / Android
  • คอมพิวเตอร์ PowerPC:
    • คุณเรียกใช้ Mono แบบเต็มสำหรับระบบปฏิบัติการ Linux, BSD หรือ Unix
    • คุณเรียกใช้ Mono สำหรับ PS3, Wii หรือระบบฝังตัวอื่น ๆ
    • บน XBox360 คุณเรียกใช้ CompactFramework
  • คอมพิวเตอร์ S390, S390x, Itanium, SPARC:
    • คุณรันโมโนแบบเต็ม
  • ระบบปฏิบัติการฝังตัวอื่น ๆ :
    • คุณเรียกใช้. NET MicroFramework หรือ Mono ด้วยโพรไฟล์มือถือ

ขึ้นอยู่กับความต้องการของคุณข้างต้นอาจเพียงพอหรือไม่ คุณแทบจะไม่ได้รับซอร์สโค้ดเดียวกันเพื่อเรียกใช้ทุกที่ ตัวอย่างเช่นรหัส XNA จะไม่ทำงานบนเดสก์ท็อปทุกเครื่องในขณะที่ซอฟต์แวร์. NET Desktop จะไม่ทำงานบน XNA หรือโทรศัพท์ โดยทั่วไปคุณจะต้องทำการเปลี่ยนแปลงรหัสเพื่อให้ทำงานในส่วนกำหนดค่าอื่น ๆ ของ. NET Framework นี่คือบางส่วนของโปรไฟล์ที่ฉันรู้:

  • . NET 4.0 Profile
  • โปรไฟล์ Silverlight
  • โปรไฟล์ Windows Phone 7
  • โปรไฟล์ XBox360
  • โมโนคอร์โปรไฟล์ - ติดตามโปรไฟล์. NET และมีให้บริการบน Linux, MacOS X, Solaris, Windows และ BSD
  • .NET Micro Framework
  • Mono บนโปรไฟล์ iPhone
  • Mono บนโปรไฟล์ Android
  • Mono บน PS3 Profile
  • Mono บนโปรไฟล์ Wii
  • โปรไฟล์ Moonlight (เข้ากันได้กับ Silverlight)
  • โปรไฟล์เสริม Moonlight (Silverlight + การเข้าถึง. NET 4 API แบบเต็ม)

ดังนั้นหนึ่งในโปรไฟล์เหล่านั้นแตกต่างกันเล็กน้อยจริง ๆ และนี่ไม่ใช่สิ่งเลวร้าย แต่ละโปรไฟล์ได้รับการออกแบบให้เหมาะสมกับแพลตฟอร์มโฮสต์และเปิดเผย API ที่สมเหตุสมผลและลบโปรไฟล์ที่ไม่สมเหตุสมผล

ตัวอย่างเช่น API ของ Silverlight เพื่อควบคุมเบราว์เซอร์โฮสต์ไม่สมเหตุสมผลกับโทรศัพท์ และ shaders ใน XNA ไม่สมเหตุสมผลกับฮาร์ดแวร์ของพีซีที่ขาดการสนับสนุนเทียบเท่า

ในไม่ช้าคุณก็จะพบว่า. NET ไม่ใช่วิธีการแยกนักพัฒนาออกจากความสามารถพื้นฐานของฮาร์ดแวร์และแพลตฟอร์มเนทีฟ

ที่กล่าวไว้เริ่มต้น API และสแต็กบางตัวมีอยู่ในหลายแพลตฟอร์มเช่น ASP.NET สามารถใช้บน Windows, Linux, บน Solaris, บน MacOS X เพราะ API เหล่านั้นมีอยู่ทั้งใน. NET และ Mono ASP.NET ไม่สามารถใช้งานได้บนแพลตฟอร์มที่รองรับของ Microsoft เช่น XBox หรือ Windows Phone 7 และไม่รองรับบนแพลตฟอร์มอื่นที่ Mono รองรับเช่น Wii หรือ iPhone

ข้อมูลต่อไปนี้ถูกต้องเฉพาะ ณ วันที่ 21 พฤศจิกายนและหลายสิ่งในโลกโมโนจะมีการเปลี่ยนแปลง

หลักการเดียวกันนี้สามารถนำไปใช้กับสแต็คอื่น ๆ ได้รายการทั้งหมดจะต้องมีตารางที่เหมาะสมซึ่งฉันไม่รู้ว่าจะนำเสนอที่นี่ได้อย่างไร แต่นี่คือรายการเทคโนโลยีที่อาจไม่ปรากฏบนแพลตฟอร์มใดแพลตฟอร์มหนึ่ง คุณสามารถสันนิษฐานได้ว่าไม่มีสิ่งใดในรายการที่นี่ (สามารถส่งการแก้ไขสำหรับสิ่งที่ฉันพลาดได้)

Core Runtime Engine [ทุกที่]

  • Reflection รับการสนับสนุนทุกที่ยกเว้น WP7, CF, Xbox, MonoTouch, PS3
  • รองรับ CPU SIMD [Linux, BSD, Solaris, MacOS X; เร็ว ๆ นี้ PS3, MonoTouch และ MonoDroid]
  • Continuations - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
  • การชุมนุมไม่โหลด [Windows เท่านั้น]
  • VM Injection [Linux, BSD, MacOS X, Solaris]
  • DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
  • Generics [ข้อ จำกัด บางอย่างเกี่ยวกับ PS3 และ iPhone]

ภาษา

  • C # 4 [ทุกที่]
  • คอมไพเลอร์ C # เป็นบริการ (Linux, MacOS, Solaris, BSD, Android)
  • IronRuby [ทุกที่, รัน WP7, CF, Xbox, MonoTouch, PS3]
  • IronPython [ทุกที่, รัน WP7, CF, Xbox, MonoTouch, PS3]
  • F # [ทุกหนแห่ง, รัน WP7, CF, Xbox, MonoTouch, PS3]

กองเซิร์ฟเวอร์

  • ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
  • ADO.NET [ทุกที่]
  • LINQ ไปยัง SQL [ทุกที่]
  • Entity Framework [ทุกที่]
  • Core XML stack [ทุกที่]
    • การจัดลำดับ XML [ทุกที่ยกเว้น WP7, CF, Xbox)
  • LINQ เป็น XML (ทุกที่)
  • System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
  • System.Messaging [Windows; บน Linux, MacOS และ Solaris ต้องการ RabbitMQ]
  • .NET 1 Enterprise Services [Windows เท่านั้น]
  • WCF [สมบูรณ์บน Windows; เซตย่อยขนาดเล็กบน Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
  • เวิร์กโฟลว์ของ Windows [Windows เท่านั้น]
  • ข้อมูลเฉพาะของ Cardspace [Windows เท่านั้น]

กอง GUI

  • Silverlight (Windows, Mac, Linux - พร้อม Moonlight)
  • WPF (Windows เท่านั้น)
  • Gtk # (Windows, Mac, Linux, BSD)
  • Windows.Forms (Windows, Mac, Linux, BSD)
  • MonoMac - Native Mac Integration (Mac เท่านั้น)
  • MonoTouch - Native iPhone Integration (iPhone / iPad เท่านั้น)
  • MonoDroid - การผสานรวมระหว่างระบบ Android (สำหรับ Android เท่านั้น)
  • Media Center APIs - Windows เท่านั้น
  • Clutter (Windows และ Linux)

ห้องสมุดกราฟิก

  • GDI + (Windows, Linux, BSD, MacOS)
  • ควอตซ์ (MacOS X, iPhone, iPad)
  • ไคโร (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)

ไลบรารีโมโน - แพลตฟอร์มข้ามสามารถใช้ใน. NET แต่ต้องสร้างด้วยตนเอง

  • คอมไพเลอร์ C # 4 เป็นบริการ
  • เซซิล - การจัดการ CIL, ขั้นตอนการทำงาน, เครื่องมือวัดของ CIL, ตัวเชื่อมโยง
  • ห้องสมุด RelaxNG
  • Mono.Data. * ผู้ให้บริการฐานข้อมูล
  • Full System.Xaml (สำหรับใช้ในการตั้งค่าโดยที่. NET ไม่มีสแต็ก)

MonoTouch หมายถึง Mono ทำงานบน iPhone MonoDroid หมายถึง Mono ทำงานบน Android; พอร์ต PS3 และ Wii พร้อมใช้งานสำหรับนักพัฒนาที่มีคุณสมบัติของ Sony และ Nintendo เท่านั้น

ฉันขอโทษสำหรับการขาดระเบียบ


2
IBM, ถ้าคุณอ่านสิ่งนี้, ฉันอยากให้ AIX (หรือแม้กระทั่ง AS / 400) อยู่ในรายการ Miguels !!

4
ขอบคุณสำหรับคำตอบที่แน่นอนผู้มีอำนาจ (sp?)!

10
เรารู้ว่า IBM ได้ทำอย่างน้อยสองพอร์ตของ Mono ไปยัง AIX แต่ทีมที่ทำพอร์ตนั้นไม่ได้รับอนุญาตให้ปล่อยการเปลี่ยนแปลงกลับ
miguel.de.icaza

3
+1 - ผู้ชายคนนี้น่าจะทำงานในโครงการโมโน! โปรดอย่าใช้เหยื่อล่อ);
เจฟฟ์

1
@JeffO: ผู้ชายคนนี้เป็นผู้สร้าง Mono ;-)
seoul

114

ก่อนอื่นคุณต้องสร้างความแตกต่างระหว่าง Common Language Infrastructure (มาตรฐานแบบเปิด) และ. NET (การใช้มาตรฐานของ Microsoft) Mono เป็นการนำ CLI มาใช้และไม่เคยอ้างว่าเป็น "พกพา. NET" นอกจากนี้ภาษา C # เป็นมาตรฐานแบบเปิดและไม่เชื่อมโยงกับ. NET อย่างเคร่งครัด

ฉันไม่ทราบว่า Microsoft มีเครื่องมือใด ๆ ที่จะตรวจสอบว่าการใช้งานนั้นเป็นไปตามมาตรฐานหรือไม่ แต่ถ้าทำได้ฉันค่อนข้างแน่ใจว่าพวกโมโนมีอยู่หรือไม่และใช้งานได้

Mono ซ่อนตัวอยู่หลัง. Net แต่แทบจะไม่ Mono สามารถเรียกใช้รหัส C # 4.0 (เวอร์ชัน. NET ปัจจุบัน) นอกจากนี้ Microsoft เพิ่งสร้างรหัส DLR และไลบรารีโอเพนซอร์สทั้งหมด (ภายใต้ใบอนุญาต Apache 2.0) ซึ่งเปิดใช้งานโมโนเพื่อใช้ภาษาเช่น IronPython, IronRuby และ F # ได้ทำขึ้นเมื่อสัปดาห์ที่แล้วเท่านั้น นอกจากนี้ Microsoft กำลังปล่อย CTPs ของคุณสมบัติที่จะเกิดขึ้นเป็นประจำใน. NET ซึ่งช่วยให้นักพัฒนาโมโนสามารถติดตามเวอร์ชันล่าสุดของรีลีสได้

มีเครื่องมือและส่วนขยายจำนวนมากใน. NET เช่น Code Contracts สิ่งเหล่านี้ไม่ได้นำมาใช้อย่างสมบูรณ์ในระบบโมโน (ปัจจุบันฉันคิดว่ามีตัวตรวจสอบสัญญาบางส่วนสำหรับต้องใช้สัญญา) สิ่งเหล่านี้ไม่ได้ใช้กันทั่วไปในแอป. NET แต่หากความนิยมของพวกเขาเพิ่มขึ้นอัตราการที่พวกเขาจะนำไปใช้งานก็จะเป็นแบบโมโน

WinForms ไม่ใช่แบบพกพา (ทั้งหมด) พวกเขาเป็น. NET เฉพาะและไม่ได้เป็นส่วนหนึ่งของ CLI CLI ไม่ได้ระบุชุดเครื่องมือเฉพาะใด ๆ มีชุดเครื่องมือข้ามแพลตฟอร์ม (แม้ว่า GTK # และ Silverlight) หากคุณกำลังเขียนแอปพลิเคชันตั้งแต่แรกเริ่มโดยคำนึงถึงความสะดวกในการพกพาคุณจะต้องใช้หนึ่งในนั้นแทน Winforms / WPF นอกจากนี้โมโนยังมี wrapper บาง ๆ สำหรับ Winforms API ซึ่งช่วยให้แอป winforms ที่มีอยู่สามารถทำการเชื่อมต่อได้ง่ายขึ้นใน GTK # (โดยไม่ต้องเขียนซ้ำทั้งหมด)

Mono มีเครื่องมือคือ Mono Migration Analyzer (MoMA) ซึ่งสามารถใช้แอปพลิเคชั่น. Net ที่มีอยู่และบอกคุณเกี่ยวกับความสะดวกในการพกพา (เช่นระบุไลบรารีที่ไม่สามารถนำไปใช้งานได้เช่น P / Invokes เป็นต้น)

สำหรับธุรกิจที่ไม่ต้องการพึ่งพาโอเพ่นซอร์ส - โมโนสามารถให้สิทธิ์การใช้งานอีกครั้ง การเป็นเจ้าของรหัสที่เพิ่มให้กับโมโนนั้นจะมอบให้กับโนเวลซึ่งสามารถให้สิทธิ์ใช้งานในรูปแบบอื่นนอกเหนือจากสิทธิ์ใช้งาน LGPL ปกติ (ซึ่งมีข้อ จำกัด น้อยมาก)

ดังนั้นสำหรับการเรียกร้อง ". NET เป็นแบบพกพา" ฉันคิดว่านี่อาจเป็นการยืนยันที่ถูกต้องหากคุณกำลังเขียนโค้ดจากพื้นดินขึ้นและตระหนักถึงปัญหาการพกพาที่มีกรอบ หากการอ้างสิทธิ์คือ "ฉันมีแอปพลิเคชัน windows ที่เขียนใน. NET มันควรทำงานแบบโมโน" ไม่ใช่ใช่มันไม่ใช่การอ้างสิทธิ์ที่ถูกต้อง แต่ Mono ได้ใช้ความพยายามในการทำให้พอร์ตแอปพลิเคชันง่ายขึ้น


20
+1 สำหรับย่อหน้าสุดท้าย
Davy8

4
the C# language is an open standard, and is not strictly tied to .NET.และC# 4.0 code (current .NET version)ขัดแย้ง
Jader Dias

9
จุดสุดท้ายของคุณดีสำหรับคุณและใช้กับ Java อย่างเท่าเทียมกัน เพียงเพราะคุณเขียนโค้ดแอปของคุณใน Java ไม่ได้หมายความว่ามันจะพกพาไปทุกแพลตฟอร์มที่รองรับ Java โดยอัตโนมัติ โดยเฉพาะอย่างยิ่งสำหรับโครงการที่ซับซ้อนมากขึ้นคุณจะพบว่าแอปพลิเคชัน Java จำนวนมากมีรหัสเฉพาะแพลตฟอร์ม
Dean Harding

5
@ user8057: Winforms นำไปใช้ 100% หรือไม่ อย่างจริงจัง? ตรวจสอบส่วนประกอบ RichTextBox ลองใช้ฟังก์ชั่นการลากและวางบนส่วนประกอบทรี Swing เป็นแพลตฟอร์มข้ามแพลตฟอร์ม 100% แต่อาจหมายถึงการดูดในทุกแพลตฟอร์ม
Dan Rosenstark

2
@Yar: LOL สำหรับ "แม้ว่านั่นอาจหมายถึงการดูดบนแพลตฟอร์มทั้งหมด" :-)
Wizard79

14

ทีละจุด:

  • OpenJDK และผู้จัดจำหน่ายทั้งหมดที่จัดหาให้ JVM ได้ผ่าน Sun TCK อย่างเป็นทางการเพื่อให้แน่ใจว่าสิ่งต่าง ๆ ทำงานอย่างถูกต้อง ฉันไม่ทราบว่า Mono ผ่าน Microsoft TCK
    มีข้อกำหนดที่ Microsoft CLR เป็นไปตาม Mono ไม่ได้เป็นโคลนของ CLR ของ Microsoft แต่เป็นการดำเนินการตามข้อกำหนดเดียวกันนั้น ในอีกด้านหนึ่งมีโอกาสที่ผลลัพธ์นี้จะเข้ากันไม่ได้มากขึ้น ในทางปฏิบัติมันใช้งานได้ดีกับโมโน
  • Mono นำเสนอ. NET ขณะนี้รองรับระดับ. NET อะไรบ้าง
    เนื่องจากเอกสารสำหรับ. Net นำหน้ารุ่นจริงจริง ๆ แล้วโมโนได้เสร็จสิ้นการสนับสนุน (ไม่ใช่รุ่นเบต้า) สำหรับ. 4 สุทธิก่อนที่จะมีการเปิดตัวอย่างเป็นทางการของ Microsoft นอกจากนี้โมโนยังทำงานได้ดีมากในการบันทึกสิ่งที่ไม่ได้รับการสนับสนุนและมีเครื่องมือสองสามอย่างที่คุณสามารถเรียกใช้กับโปรเจ็กต์ที่มีอยู่เพื่อช่วยให้คุณมองเห็นสถานที่ที่มีความเข้ากันไม่ได้
  • องค์ประกอบ GUI (WinForms ทั้งหมด) ทำงานอย่างถูกต้องใน Mono หรือไม่
    winforms ส่วนใหญ่ทำงานได้ดี WPF ไม่มาก ฉันได้ยินมาว่าสิ่งนี้เป็นจริงสำหรับ Java - ชุดเครื่องมือ / gui ขั้นสูงจำนวนมากไม่ได้รับการสนับสนุนในทุกแพลตฟอร์ม
  • ธุรกิจอาจไม่ต้องการพึ่งพากรอบงานโอเพ่นซอร์สตามแผนอย่างเป็นทางการของ B
    หากเป็นกรณีนี้พวกเขาจะไม่ไปกับจาวาอย่างแน่นอนเพราะจะทำให้กรอบงานโอเพนซอร์ซสูงขึ้นตามแผน A

โดยสรุปหากคุณต้องการสร้างแอปข้ามแพลตฟอร์มในตอนนี้ไม่มีอะไรผิดปกติเมื่อเริ่มต้นด้วยโมโนจากการเดินทางและใช้มันเป็นเฟรมเวิร์กของคุณ คุณสามารถปรับใช้ขาวดำบน Windows ได้หากต้องการ

ในทางตรงกันข้ามหากคุณกำลังมองหาการสร้างแอพ Windows ในวันนี้ซึ่งคุณคิดว่าอาจจะต้องข้ามแพลตฟอร์มไปยังจุดที่ไม่ทราบในอนาคตคุณอาจต้องการใช้เครื่องมือและเครื่องมือ Windows ดั้งเดิม .Net ทำงานได้ดีกว่าที่นี่มากกว่า Java และโมโนเป็นที่ยอมรับอย่างสมบูรณ์แบบในสถานการณ์นี้

ในคำอื่น ๆ : ใช่สุทธิถ้าข้ามแพลตฟอร์มในทุก ๆ เรื่องที่คำถามของคุณ ไม่โมโนไม่เพียง แต่รันโปรแกรม. Net ทุกตัวนอกกรอบ แต่คำถามของคุณอยู่ในบริบทของโครงการใหม่ มันไม่ได้ใช้งานมากนักเพื่อป้องกันไม่ให้โครงการใหม่ ๆ ประสบปัญหาและหลีกเลี่ยงปัญหาความเข้ากันได้โดยเฉพาะอย่างยิ่งถ้าคุณคิดในแง่ของการพัฒนาสำหรับโมโนมากกว่าการพัฒนาสำหรับ. Net

อย่างไรก็ตามที่สำคัญที่สุดฉันคิดว่านี่เป็นคำถามที่ผิดตั้งแต่แรก นอกจากว่าคุณกำลังสร้างทีมพัฒนาใหม่ตั้งแต่เริ่มต้นคุณจะเริ่มต้นด้วยโปรแกรมเมอร์ที่มีความเชี่ยวชาญในด้านใดด้านหนึ่ง ผลลัพธ์ที่ดีที่สุดของคุณจะประสบความสำเร็จโดยไปกับสิ่งที่โปรแกรมเมอร์ของคุณรู้อยู่แล้ว สิ่งสำคัญเท่ากับการสร้างแอพข้ามแพลตฟอร์มอาจดูเหมือนว่าถ้าคุณมีทีมงานที่เต็มไปด้วยโปรแกรมเมอร์. Net ด้วยประสบการณ์การใช้งานจาวาเพียงเล็กน้อยคุณไม่น่าจะยิงพวกเขาหรือทำให้พวกเขาเรียนรู้จาวาสำหรับโครงการต่อไป หากคุณมีทีมงานที่เต็มไปด้วยโปรแกรมเมอร์ Java คุณจะไม่ขอให้พวกเขาเรียนรู้. Net สำหรับโครงการที่ใช้ Windows เท่านั้น อย่างใดอย่างหนึ่งจะเป็นถั่ว


เพียงชี้แจงปัญหา "โอเพ่นซอร์ส": ฉันคิดถึงโครงการโอเพ่นซอร์สเนื่องจากไม่ได้รับการสนับสนุนจากองค์กรธุรกิจที่น่าเชื่อถือไม่ใช่ธุรกิจที่มีซอร์สโค้ดของ GPL

3
Novell ไม่ใช่“ องค์กรธุรกิจที่เหมาะสม” หรือไม่?
svick

@svick - ฉันไม่คิดว่า "suable" เป็นคำสะกดผิด เขากังวลเกี่ยวกับประเด็นทางกฎหมายที่อยู่รอบ ๆ ผู้สนับสนุนโครงการ
Joel Coehoorn

@Thorbj จากมุมมองทางธุรกิจดีกว่าที่จะมีหน่วยงานสนับสนุนที่แข็งแกร่งเช่น Novell มากกว่าองค์กรนามธรรมเช่น JCP
Joel Coehoorn

@ user8057 อ่าฉันไม่เคยได้ยินคำนั้นมาก่อน มันดูเหมือนคำที่พิมพ์ผิด
svick

11

ฉันทำงานกับ Mono แล้วฉันจะบอกว่ามันดีเท่าที่คุณจะทำได้ด้วยแพลตฟอร์มอื่นที่เป็นโอเพ่นซอร์สและไม่ได้รับการสนับสนุนโดยตรงจาก Microsoft หากคุณสามารถใช้งานแพลตฟอร์มโอเพ่นซอร์สอย่าง Clojure หรือ Scala ได้อย่างสบาย ๆ คุณอาจจะรู้สึกสบายใจกับการใช้โมโน

ระดับของการสนับสนุนจาก .NET โมโนจะสามารถพบได้ในโมโน Roadmapหน้า

องค์ประกอบ GUI ทั้งหมดใช้งานได้หรือไม่ เท่าที่ฉันรู้พวกเขาทำแม้ว่าฉันจะไม่ได้ลองทุกองค์ประกอบอย่างละเอียดถี่ถ้วน

Mono เหมือนกันกับ. NET หรือไม่ ไม่ฉันคิดว่าจะต้องมีการปรับแต่งเล็กน้อย (และอาจสำคัญ) ที่นี่และที่นั่น ในปัจจุบันคุณไม่สามารถเรียกใช้ Entity Framework กับมันได้


แน่นอน Mono ไม่ใช่โคลนที่แน่นอน แต่จากสิ่งที่ฉันเห็นมันเป็นตัวเลือกที่มีศักยภาพมากเมื่อเริ่มต้นโครงการใหม่
ChaosPandion

ตัวละครในคุณ pic pic me3i หรือไม่? จาก美国
Jader Dias

1
@Jader, ไม่เกี่ยวข้องกันโดยสิ้นเชิง - แต่นั่นเป็นตัวอักษรจีนสำหรับความสวยงามและ美国 (เมื่อรวมหมายถึงสหรัฐอเมริกายังหมายถึงประเทศที่สวยงามอย่างแท้จริง)
aggietech

AFAIK Clojure และ Scala เป็นภาษาที่ไม่ใช่แพลตฟอร์ม และ (อีกครั้ง AFAIK) Scala ควรทำงานกับการใช้งาน JVM ใด ๆ ที่ Java สามารถทำงานได้
Giorgio

9

ในฐานะที่เป็นเป้าหมายจักรวาล .NET / ขาวดำไปอย่างรวดเร็วมาก

ทุกๆสองสามปี Microsoft จะมีการเปลี่ยนแปลงและนวัตกรรมที่น่าสนใจเกี่ยวกับภาษารันไทม์และโครงสร้างพื้นฐานโดยรอบ. NET ตัวอย่างเช่น: Generics, LINQ, DLR, Entity Framework - ด้วยการแก้ไข Visual Studio ใหม่ทุกครั้งโดยทั่วไปจะมีการเพิ่มขึ้นอย่างมากในชุดคุณสมบัติและประโยชน์ของกรอบเป้าหมาย

ในขณะที่การปรับปรุงอย่างต่อเนื่องในกรอบยินดีต้อนรับก็เป็นปัญหาถ้าคุณต้องการความเข้ากันได้ในหลายแพลตฟอร์ม แพลตฟอร์มที่ให้การสนับสนุนระยะยาวเช่น Red Hat Enterprise Linux เคลื่อนที่ช้ามากเกี่ยวกับการนำเทคโนโลยีใหม่มาใช้และ ณ จุดใดก็ตามจะมีการปรับปรุงที่สำคัญในแพลตฟอร์มโมโนที่เกิดขึ้นภายในไม่กี่เดือนที่ผ่านมา ดังนั้นหากคุณต้องการเรียกใช้สิ่งที่เด็ก ๆ กำลังสร้างคุณจะต้องรวบรวมโมโนตั้งแต่เริ่มต้นและจัดการแพตช์และการอัปเดตของคุณเอง นั่นไม่เจ๋ง

Java ในทางกลับกันก็นิ่งเหมือนสระตัวเล็ก โดยเฉพาะอย่างยิ่งตอนนี้ บริษัท ของตัวเองที่เพิ่งต้องการ Java สำหรับคดีสิทธิบัตรคุณสามารถมั่นใจได้อย่างแน่นอนว่าจะไม่มีการเปลี่ยนแปลงที่ตรวจพบได้ในภาษาหรือรันไทม์ในอนาคตอันใกล้ Java มีความเสถียรของแพลตฟอร์มเท่ากับ FORTRAN ไม่ดีนักหากคุณหวังว่าจะได้รับการปรับปรุงใด ๆ แต่ก็ไม่เลวร้ายนักหากคุณพยายามปรับใช้แอปพลิเคชันระดับองค์กร


ตลกที่คุณพูดถึง Fortran เพราะมันมีการพัฒนาอย่างต่อเนื่องโดยเน้นการเห็นพ้องและ parallazetion เช่นเดียวกับหลักการ OOP ใช่แล้ว Fortran 77 นั้นเสถียร แต่เนื่องจาก Fortran 90 ออกมาการแก้ไขแต่ละครั้งจะดีขึ้นเรื่อย ๆ Fortran 2008 เป็นภาษาที่ "เกือบ" เป็นภาษาสมัยใหม่
ja72

4
ฉันจะบอกว่า. Net / C # 1.0 นั้นดีที่สุดในการโคลนนิ่ง Java ที่แย่ แต่โดย. Net 2.0 มีคุณลักษณะที่ดีพอ ๆ กันระหว่างสองแพลตฟอร์ม จากที่นั่นไปจนถึง. Net 3.5 / C # 3 แพลตฟอร์มของ Microsoft ได้ทิ้ง Java ไว้ได้ดีในพื้นที่ส่วนใหญ่และยังคงได้รับคุณสมบัติใหม่เช่นการพิมพ์แบบไดนามิกและคุณสมบัติที่กำลังจะมาถึงเช่น async concurrency พร้อมกัน นั่นคือเหตุผลหนึ่งที่ทำให้. Net สามารถเคลื่อนที่ได้อย่างรวดเร็วคือทางที่เหลือของ Java หาก Oracle ต้องการย้าย Java ไปข้างหน้าพวกเขาจะสามารถติดตามเส้นทางที่คล้ายกันได้อย่างรวดเร็วโดย Microsoft
Joel Coehoorn

". NET / mono universe เคลื่อนที่เร็วมาก" น่าแปลกที่เหตุผลหลักที่เราไม่ใช้ Mono ก็คือการพัฒนา GC นั้นช้ามากเลือดตาแทบกระเด็น พวกเขาอธิบายว่า GC มั่นคงในปัจจุบันเป็น "มาตรการชั่วคราว" ในปี 2003! lists.ximian.com/pipermail/mono-gc-list/2003-August/000012.html
Jon Harrop

หรือคุณสามารถรัน Debian / Ubuntu ใช้ที่เก็บ apt ภายนอกและเล่นกับเด็กเจ๋ง ๆ โดยไม่ต้องคอมไพล์โมโนตั้งแต่ต้น
แน่ใจ

7

จากมุมมองของผู้ใช้ Mono ทำให้การใช้งานแอพ Windows .NET เข้ากันได้กับ Linux หากคุณพยายามเรียกใช้แอพ Windows ที่เขียนขึ้นอย่างเหมาะสมใน Mono มันจะไม่ทำงาน

จากมุมมองของผู้ทำแพ็กเกจ (ฉันเคยทำงานที่ PortableApps) NET สามารถเป็นทั้งคำอวยพรและคำสาป หากคุณใช้ Windows เพียงอย่างเดียว. NET ทำให้การปรับใช้ง่ายขึ้นมากเนื่องจากมีไลบรารีมากขึ้นซึ่งหมายถึงสิ่งที่ขึ้นอยู่กับระบบน้อยกว่า (โดยเฉพาะอย่างยิ่งระหว่างเวอร์ชันของ Windows ฉันเชื่อว่า) แต่ยังสับสนอย่างมากแม้ใน Windows เข้ากันได้หรือส่งต่อเข้ากันได้ คุณต้องดาวน์โหลด. NET เวอร์ชั่นต่างๆสำหรับโปรแกรมต่างๆ

นั่นคือโมโนเป็นจุดเริ่มต้นที่ดีในการสร้างโปรแกรม C # ข้ามแพลตฟอร์ม อย่าเพิ่งทำแพ็คเกจโปรแกรมด้วยไวน์ล่าสุดและเรียกมันว่าทำได้ ดูว่าที่ไหนที่ใช้ Picasa

เช่นเดียวกับความมั่นคงทางการเมืองทั้งสองภาษา / แพลตฟอร์ม RMS อาจเริ่มพูดคุยเกี่ยวกับวิธีที่โมโนเป็นผู้นำโดยโนเวลล์ซึ่งฮันนีมูนกับไมโครซอฟท์มีชื่อเสียงมาก ทั้งสองแพลตฟอร์มสามารถได้รับการพิจารณาทางการเมืองที่ไม่เสถียรในขณะนี้

หากคุณต้องการข้ามแพลตฟอร์มที่ง่ายจริง ๆ เส้นทางที่ลองและเป็นจริงคือ QT ซึ่งค่อนข้างมีเสถียรภาพทางการเมือง ณ ตอนนี้มันคือ) LGPL จะ b) ทำกับปัญหาลิขสิทธิ์ที่สำคัญเมื่อหลายปีก่อนและ c) ที่ได้รับการสนับสนุนจาก Nokia ซึ่งขายโทรศัพท์ยอดนิยมจริงๆ


5
สิ่งที่เปลี่ยนแปลงอย่างรวดเร็ว Nokia ไม่ต้องการขายโทรศัพท์ที่คนต้องการอีกต่อไปและโนเวลไม่สามารถอยู่กับอนาคตของทั้ง Qt และ Mono ได้อีกต่อไป นี่อาจเป็นเหตุผลว่าทำไมธุรกิจไม่ชอบใช้อะไรนอกเหนือจากระบบ 'สนับสนุนหลัก' เช่น Microsoft นี่คือเหตุผลที่โอเพนซอร์สเป็นความคิดที่ดี
gbjbaanb

4

Mono ไม่ใช่พอร์ต 1: 1 ของ. net ของ Microsoft มีเทคโนโลยีที่โมโนจะไม่ใช้งานหรือไม่มีแผนที่จะทำ (เช่น Workflow Foundation หรือWPF ) ในขณะที่พวกเขามีเทคโนโลยีบางอย่างที่ Microsoft .NET ไม่ทำเช่น SIMD Extensions .

คำตอบสั้น ๆ : Mono และ Microsoft .NET ใช้พื้นฐานพื้นฐานเดียวกันคือ CIL และ BCL แต่เป็นโครงการแยกต่างหาก


2

ความคิดเห็นเล็ก ๆ กับข้อความในโพสต์ต้นฉบับ ฉันจะยืนยันว่า TCK ยังคงเป็นเครื่องมือทางทฤษฎีที่อนุญาตให้ Oracle เรียกร้อง Java เป็นมาตรฐานเปิด เพราะถ้าคุณสังเกตเห็น Apache Harmony พยายามรับรองว่าเป็น "Java" มาหลายปีแล้ว แต่ไม่สำเร็จ เป็นที่ชัดเจนว่า Oracle ไม่สนใจในการนำโอเพ่นซอร์สมาใช้นอกเหนือจากที่พวกเขามีส่วนเกี่ยวข้องและมีการควบคุมมากขึ้นหรือน้อยลง (OpenJDK) ซึ่ง btw คล้าย Mono ไม่สมบูรณ์ (เช่นไม่มีการสนับสนุน Java Web Start) และขาดการเพิ่มประสิทธิภาพบางอย่างในการใช้งาน HotSpot แบบปิดแหล่งที่มา

ดังนั้นเนื้อหาในปี 2010; (ส่วนใหญ่) Java เป็นโอเพ่นซอร์ส แต่ไม่ใช่มาตรฐานแบบเปิดในขณะที่ (ส่วนใหญ่). NET ไม่ใช่โอเพ่นซอร์ส แต่เป็นมาตรฐานแบบเปิด มีข้อยกเว้นแน่นอน DLR, IronPython, IronRuby และ F # จริงๆแล้วเป็นโอเพ่นซอร์ส Mono นั้นน่าสนใจเพราะมันให้สิ่งที่ดีที่สุดของทั้งสองโลกการใช้งานโอเพ่นซอร์สของมาตรฐานแบบเปิด


การเปิดกว้างของ Java ไม่ได้เป็นส่วนสำคัญเช่นนี้ มันเป็นประสบการณ์ของฉันที่โปรแกรมของฉันทำงานได้ดีบน JVM ที่ผ่าน TCK เพื่อให้เป็นพารามิเตอร์ที่สำคัญ

1

การแยกส่วนทั้งหมดออกจากกันส่วนที่สำคัญมากก็คือการเขียนโค้ด

เช่นเดียวกับเทคโนโลยีข้ามแพลตฟอร์มใด ๆ (ไม่ว่าจะเป็น Java, Python, Ruby ... ) หากรหัสไม่ได้เขียนด้วยการพกพาในใจคุณควรถือว่ามีโอกาสเป็นศูนย์รหัสจะทำงานอย่างถูกต้องเป็นศูนย์ (แม้ว่าโอกาสดังกล่าวคือ ในความเป็นจริงมากขึ้น) ในขณะที่ความผิดที่ผิดปกติอาจสำคัญมาก อ่าน: อย่าใช้แอสเซมบลีแบบสุ่มและเรียกใช้ภายใต้โมโน

แต่สำหรับโครงการใหม่ (หรืออย่างใดอย่างหนึ่งที่คุณสามารถสร้างใหม่ได้อย่างง่ายดาย) เลือก. Net / Mono เป็นรันไทม์แบบพกพาที่เหมาะสม แต่คุณช่วยให้คุณไม่ต้องยุ่งยากมากนักโดยทดสอบโค้ดของคุณบน Mono ตั้งแต่แรกแม้ว่าโครงการจะมี มีการเปลี่ยนแปลงเพียงเล็กน้อยในการใช้งานหลายแพลตฟอร์ม หากคุณใช้เซิร์ฟเวอร์รวมอย่างต่อเนื่องสิ่งนี้อาจทำได้ง่ายเหมือนการตั้งค่าโหนดการสร้างโมโน ปัญหาหลายอย่างสามารถแก้ไขได้ในขณะที่กำลังพัฒนาโดยการสร้างนิสัย (เช่นการสร้างสายอักขระเส้นทาง) และโค้ดขนาดใหญ่ของคุณสามารถพกพาและทดสอบหน่วยในโมโนเพียงแค่ใช้วิธีปฏิบัติที่มีสติและความสุขุมเล็กน้อย ส่วนที่เหลือ (เช่นการทดสอบหน่วยที่ล้มเหลว) นั้นเป็นแพลตฟอร์มเฉพาะ (เช่นรหัสโดยใช้ PInvoke) แต่ควรมีการห่อหุ้มให้เพียงพอเพื่อให้สามารถใช้งานทางเลือกต่อแพลตฟอร์มเป้าหมายได้

แน่นอนว่าการใช้งานไลบรารีที่ไม่พร้อมใช้งาน (.Net) หรือใช้งานร่วมกันได้ (บุคคลที่สาม) ใน Mono จะทำให้หมดไปจากสิ่งนี้ แต่ในสาขาของฉันสิ่งนี้ยังไม่สามารถมองเห็น นั่นคือกลยุทธ์ที่เราใช้ในการทำงานจริงและเมื่อนำไปใช้ฉันไม่กลัวที่จะอ้างว่า. Net + Mono เป็นแพลตฟอร์มข้าม


0

มันแตกต่างกันคือคำตอบที่ซื่อสัตย์ ฉันได้เห็นสิ่งที่เว็บเซิร์ฟเวอร์ขนาดเล็กย้ายจาก IIS ไปยัง Apache ทำงานภายใต้โมโนโดยแทบจะไม่ลำบาก ฉันรันแอพพลิเคชั่น Windows .Net โดยไม่เปลี่ยนแปลงโดยใช้ Win Forms บน Linux ได้สำเร็จ

อย่างไรก็ตามในขณะที่มันสามารถใช้งานได้หากคุณใช้การเรียก API ที่ไม่ได้ดำเนินการกับโมโนแล้วมันจะไม่ทำงานและทางออกเดียวคือการเขียนแอปพลิเคชันของคุณใหม่ติดกับ windows หรือเขียนสิ่งพิเศษในโมโน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.