Mono พร้อมสำหรับช่วงเวลาไพร์มหรือไม่? [ปิด]


314

มีใครใช้ Mono การใช้โอเพ่นซอร์ส .NET ในโครงการขนาดใหญ่หรือขนาดกลางหรือไม่ ฉันสงสัยว่ามันพร้อมสำหรับโลกแห่งความจริงสภาพแวดล้อมการผลิตหรือไม่ มีความเสถียรรวดเร็วเข้ากันได้ ... เพียงพอที่จะใช้หรือไม่ มันใช้เวลามากของความพยายามที่จะพอร์ตโครงการให้รันไทม์โมโนหรือมันเป็นจริงๆจริงๆพอเข้ากันได้กับเพียงแค่ใช้เวลาและการเรียกใช้รหัสเขียนไว้แล้วสำหรับรันไทม์ไมโครซอฟท์?


17
Mindtouch.com ใช้ C # บน Mono บน Debian สำหรับแพลตฟอร์มวิกิที่แข็งแกร่งมาก ไปตรวจสอบพวกเขาออก คุณสามารถดาวน์โหลด VM ที่กำหนดค่าไว้ล่วงหน้าซึ่งคุณสามารถติดตั้งและใช้งานได้อย่างง่ายดาย
lamcro

7
ฉันได้พบการใช้โมโนที่ดีที่สุดสามารถพูดได้ว่า "ถ้า Microsoft ทำ XXX เราสามารถย้ายไปเป็นโมโนบนยูนิกซ์ ... "
Ian Ringrose

5
ฉันคิดว่าคำถามนี้ควรถามอีกครั้งพิจารณาทุกสิ่งที่มีการเปลี่ยนแปลงนับตั้งแต่นี้
Jwosty

คำตอบ:


402

มีสองสถานการณ์ที่ต้องพิจารณา: (a) หากคุณกำลังย้ายแอปพลิเคชันที่มีอยู่และสงสัยว่า Mono ดีพอสำหรับงานนี้หรือไม่ (b) คุณเริ่มเขียนโค้ดใหม่และคุณต้องการทราบว่า Mono นั้นโตพอหรือไม่

สำหรับกรณีแรกคุณสามารถใช้เครื่องมือ Mono Migration Analyzer (Moma) เพื่อประเมินว่าแอปพลิเคชันของคุณทำงานบน Mono ได้ไกลแค่ไหน หากการประเมินกลับมาพร้อมสีรถคุณควรเริ่มทำการทดสอบและควบคุมคุณภาพและเตรียมพร้อมที่จะส่งมอบ

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

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

หากคุณเริ่มต้นจากศูนย์สถานการณ์ง่ายกว่ามากเพราะคุณจะใช้ API ที่อยู่ใน Mono เท่านั้น ตราบใดที่คุณยังอยู่กับสแต็กที่รองรับ (ซึ่งค่อนข้างมาก. NET 2.0 รวมถึงการอัพเกรดหลักทั้งหมดใน 3.5 รวมถึง LINQ และ System.Core รวมถึง Mono ข้ามแพลตฟอร์ม API) คุณจะทำได้ดี

ทุกครั้งในขณะที่คุณอาจพบข้อบกพร่องใน Mono หรือข้อ จำกัด และคุณอาจต้องแก้ไขพวกเขา แต่นั่นไม่แตกต่างจากระบบอื่น ๆ

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

Windows.Forms porting บางครั้งมีความซับซ้อนมากขึ้นเนื่องจากนักพัฒนาต้องการหลบหนี. sandbox. NET และ P / เรียกสมองของพวกเขาออกไปเพื่อกำหนดค่าสิ่งต่าง ๆ ที่มีประโยชน์เช่นการเปลี่ยนอัตราการกะพริบของเคอร์เซอร์ที่แสดงเป็นสองจุด bezier เข้ารหัสในรูปแบบ BCD หรือขยะบางอย่างเช่นนั้น


276
ผู้ชายคนนี้คิดว่าเขาเป็นใคร? ผู้สร้างโมโน ??? !! ... o เดี๋ยวก่อน ..

15
@Drahcir: LINQ ทำงานบน Mono ไม่ใช่เฉพาะ Windows ดังนั้นไปข้างหน้าและลอง Linux
Zifre

31
"สิ่งที่มีประโยชน์เช่นเดียวกับการเปลี่ยนอัตราการกะพริบของเคอร์เซอร์ที่แสดงเป็นจุดสองเบซิเยร์ที่เข้ารหัสในรูปแบบ BCD ใน wParam" lol
usr

12
ขอบคุณมากสำหรับโมโน ...
Evan Plaice

28
ฉันจะได้รับการอัปเดตในโพสต์นี้ ;-)
David Schmitt

65

มีพื้นที่ครอบคลุมค่อนข้างมากถึง. NET 4.0 และยังรวมถึงคุณสมบัติบางอย่างจาก. NET 4.5 APIs แต่มีบางพื้นที่ที่เราเลือกที่จะไม่ดำเนินการเนื่องจาก APIs ถูกคัดค้านทางเลือกใหม่ที่ถูกสร้างขึ้นหรือขอบเขตที่มากเกินไป ใหญ่. API ต่อไปนี้ไม่สามารถใช้ได้ใน Mono:

  • Windows Presentation Foundation
  • Windows Workflow Foundation (ไม่ใช่สองเวอร์ชัน)
  • Entity Framework
  • WSE1 / WSE2 "ส่วนเสริม" ไปยังกองบริการเว็บมาตรฐาน

นอกจากนี้การใช้ WCF ของเรานั้น จำกัด เฉพาะ Silverlight ที่สนับสนุน

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

ฉันเพิ่งวิ่ง MoMA บน SubSonic และพบปัญหาเดียวเท่านั้น - การใช้งาน Nullable แบบแปลก ๆ นั่นเป็นโค้ดเบสขนาดใหญ่ดังนั้นการครอบคลุมจึงน่าประทับใจ

โมโนมีการใช้งานอย่างแพร่หลายในผลิตภัณฑ์เชิงพาณิชย์และโอเพ่นซอร์สหลายประเภท มีการใช้งานในแอปพลิเคชันขนาดใหญ่เช่น Wikipedia และ Mozilla Developer Centerและถูกนำไปใช้ในแอพพลิเคชั่นแบบฝังเช่นเครื่องเล่น MP3 Sansa และเพิ่มพลังให้กับเกมที่เผยแพร่มากมาย

ในระดับภาษาคอมไพเลอร์โมโนเป็นอย่างสอดคล้องกับ C # 5.0 สเปคภาษา


39

ทางด้านเดสก์ท็อป Mono ใช้งานได้ดีถ้าคุณใช้ GTK # การใช้งาน Windows.Forms ยังคงเป็นรถเล็ก ๆ น้อย ๆ (เช่น TrayIcon ไม่ทำงาน) แต่มันมาไกล นอกจากนี้ GTK # เป็นชุดเครื่องมือที่ดีกว่า Windows Forms เหมือนเดิม

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

ไม่ว่าจะทางใดโมโนก็ยอดเยี่ยมและมีเสถียรภาพ

สิ่งสำคัญที่ควรจำเมื่อสร้างโปรแกรมข้ามแพลตฟอร์ม:

  • ใช้ GTK # แทน Windows.Forms
  • ตรวจสอบให้แน่ใจว่าใส่ชื่อไฟล์ของคุณอย่างถูกต้อง
  • ใช้Path.Separatorแทน hardcoding "\"ยังใช้แทนEnvironment.NewLine"\n"
  • อย่าใช้การเรียก P / Invoked ใด ๆ กับ Win32 API
  • ห้ามใช้ Windows Registry

2
Path.Separator เป็นคำแนะนำที่ดียกเว้น Mono บน OS X มี ':' ไม่ใช่ '/'! ฮา! นั่นคือตัวคั่น Mac OS เก่า (<= 9.0) อะ? Unix เป็น / ตลอดทาง
Jared Updike

3
ฉันไม่ได้สนใจกับ Environment.NewLine หรือ Path.Separator เพียงแค่ใช้ / และ \ n ระบบเดสก์ท็อปทุกระบบกำลังได้รับความนิยม (ยกเว้นว่าฉันขาดหายไปบางส่วน) ใช้ / และ \ n Windows ชอบ \ and \ r \ n แต่จะใช้ยูนิกซ์อย่างมีความสุข
Programmdude

23

โดยส่วนตัวฉันใช้ Mono ในเวลาที่เหมาะสม ฉันเรียกใช้เซิร์ฟเวอร์ขาวดำที่ทำงานกับการประมวลผลข้อมูลที่เกี่ยวข้องกับ udp / tcp giga-bytes และไม่พอใจมากขึ้น

มีลักษณะเฉพาะและสิ่งที่น่ารำคาญที่สุดอย่างหนึ่งก็คือคุณไม่สามารถ "สร้าง" ไฟล์ msbuild ของคุณเนื่องจากสถานะปัจจุบันของโมโน:

  • MonoDevelop (IDE) มีการสนับสนุน msbuild บางส่วน แต่โดยทั่วไปแล้วจะสร้างความสับสนในการสร้าง "REAL" ใด ๆ นอกเหนือจากสวัสดีโลก (งานสร้างที่กำหนดเองคุณสมบัติ "ไดนามิก" แบบไดนามิกเช่น $ (SolutionDir), การกำหนดค่าจริง ๆ -ends)
  • xbuild ซึ่งควรได้รับการโมโนจัด-MSBuild เต็มได้สร้างระบบจะยิ่งน่ากลัวมากขึ้นเพื่อสร้างจากบรรทัดคำสั่งที่เป็นจริงเป็นประสบการณ์ที่เลวร้ายยิ่งกว่าใช้ GUI ซึ่งเป็นอย่างมาก "นอกรีต" สถานะของ union สำหรับสภาพแวดล้อม Linux ...

เมื่อ / ในระหว่างการรับสิ่งของของคุณสร้างขึ้นจริงคุณอาจเห็นความเป็นป่าบางอย่างแม้กระทั่งรหัสที่ควรได้รับการสนับสนุนเช่น:

  • คอมไพเลอร์ได้รับ borked ในการสร้างบางอย่าง
  • และคลาส. NET ใหม่ขั้นสูง / ใหม่เพิ่มเติมบางอันทิ้งอึที่ไม่คาดคิดมาให้คุณ (ใคร XLinq?)
  • บางส่วน "คุณสมบัติ" ที่ยังไม่บรรลุนิติภาวะ (จำกัด ฮีพ 3GB บน x64 ... WTF!)

แต่สั่นเทากล่าวว่าสิ่งที่พูดโดยทั่วไปเริ่มต้นการทำงานได้อย่างรวดเร็วและการแก้ปัญหา / การแก้ไขปัญหามีความอุดมสมบูรณ์

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

ฉันมีเซิร์ฟเวอร์ที่ทำงานด้วยระบบโมโนประมวลผลข้อมูล 300GB ต่อวันโดยมี p / invokes จำนวนมากและโดยทั่วไปกำลังพูดถึงการทำงานจำนวนมากและอยู่ถึง 5-6 เดือนแม้จะมีโมโนตกเลือด

หวังว่านี่จะช่วยได้


1
คุณบอกฉันได้ไหม (ถ้าทำได้) เว็บไซต์ที่คุณพูดถึงคืออะไร
Christophe Debove

21

คำแนะนำสำหรับคำตอบที่ยอมรับนั้นล้าสมัยไปแล้ว

  • การติดตั้ง windows form ทำได้ค่อนข้างดีในตอนนี้ (ดูPaint-Monoสำหรับพอร์ตของ Paint.net ซึ่งเป็นแอพพลิเคชั่นแบบฟอร์ม Windows ที่มีส่วนเกี่ยวข้องทั้งหมดที่จำเป็นต้องมีคือเลเยอร์การจำลองสำหรับ P-Invoke และการเรียกระบบที่ไม่รองรับบางส่วน)
  • Path.Combine เช่นเดียวกับ Path.Seperator เพื่อเข้าร่วมเส้นทางและชื่อไฟล์
  • windows Registry นั้นใช้ได้ตราบใดที่คุณใช้เพื่อการจัดเก็บและดึงข้อมูลจากแอปพลิเคชันของคุณเท่านั้น (เช่นคุณไม่สามารถรับข้อมูลเกี่ยวกับ Windows จากมันได้เนื่องจากเป็นรีจิสตรีสำหรับแอปพลิเคชั่น Mono)

+1 สำหรับการติดตาม ... ดูเหมือนว่าหน้านี้อาจจะล้าสมัยอีกครั้ง
harpo

1
ใช่สองปีคืออายุการใช้งานในโมโนด้วยความเร็วที่พวกเขาทำงาน
Kris Erickson

12

หากคุณต้องการใช้ WPF คุณโชคไม่ดีโมโนในปัจจุบันยังไม่มีแผนที่จะใช้

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


3
มันแย่มากจริงๆ WPF เป็นชุดเครื่องมือ UI ที่เหมาะสม
JP Richardson

@JP Richardson ฉันเข้าใจในสิ่งที่คุณได้รับ - เป็นเรื่องดีเมื่อเขียนโปรแกรม - แต่ฉันไม่เรียกมันว่า "ดี" ถ้ามันถูกสร้างขึ้นจากความคิดโดยมีเจตนาที่จะเป็นชุดเครื่องมือที่ไม่สามารถพกพาได้
Wyatt8740

@ Wyatt8740 ความคิดเห็นของฉันเขียนเมื่อ 10 ปีที่แล้ว
JP Richardson

@JP Richardson ฮ่า ๆ ฉันแย่ แต่มันก็ยังไม่ได้หมายความว่าจะพกพาแม้สิบปีหลัง
Wyatt8740

9

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

TL; DR - อย่าใช้โมโนหากคุณ:

  • ใช้ AppDomains (Assembly Load \ Unload) ในสภาพแวดล้อมแบบมัลติเธรด
  • ไม่สามารถรักษาโมเดล 'ปล่อยให้มันล้มเหลว' ได้
  • สัมผัสกับเหตุการณ์ภาระหนักเป็นครั้งคราวในระหว่างกระบวนการทำงาน

ดังนั้นข้อเท็จจริง

เราใช้ mono-2.6.7 (.net v 3.5) บน RHEL5, Ubuntu และในมุมมองของฉันมันเป็นรุ่นที่เสถียรที่สุดที่ Novell สร้างขึ้น มันมีปัญหากับ Unloading AppDomains (segfaults) อย่างไรก็ตามมันล้มเหลวน้อยมากและนี่ก็เป็นที่ยอมรับ (เรา)

ตกลง. แต่ถ้าคุณต้องการใช้คุณสมบัติของ. net 4.0 คุณจะต้องเปลี่ยนไปใช้รุ่น 2.10.x หรือ 3.x และนั่นเป็นจุดเริ่มต้นของปัญหา

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

อยู่ที่นี่พร้อมคำแนะนำในการใช้: https://github.com/head-thrash/stress_test_mono

มันใช้เธรดกลุ่มผู้ทำงานเธรด คนงานโหลด dll ไปยัง AppDomain และพยายามทำคณิตศาสตร์ งานบางงานมีหลายเธรดบางงานเป็นงานเดียว งานส่วนใหญ่นั้นใช้ CPU ผูกแม้ว่าจะมีบางไฟล์ที่อ่านจากดิสก์

ผลลัพธ์ไม่ดีมาก ในความเป็นจริงสำหรับรุ่น 3.0.12:

  • กระบวนการ sgen GC segfaults เกือบจะทันที
  • โมโนที่มี boehm จะมีอายุยืนยาวกว่า (จาก 2 ถึง 5 ชั่วโมง) แต่ในที่สุด segfaults

ดังกล่าวข้างต้น sgen gc เพียงไม่ทำงาน (โมโนที่สร้างจากแหล่งที่มา):

* 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]

สำหรับ boehm segfauls - เช่น (Ubuntu 13.04, mono บิวด์จากแหล่ง):

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

หรือ (RHEL5, โมโนถูกนำมาจาก rpm ที่นี่ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home%3A/vmas%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

ความล้มเหลวทั้งสองจะเชื่อมต่อกับตรรกะของ AppDomains ดังนั้นคุณควรอยู่ห่างจากพวกเขาเป็นโมโน

BTW โปรแกรมที่ทดสอบทำงานตลอด 24 ชั่วโมงบนเครื่อง Windows ใน MS .NET 4.5 env โดยไม่ล้มเหลว

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


คุณได้ลองบั๊กในXamarin bugzilla แล้วหรือยัง?
MiKom



5

MoMA เป็นเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้ตามที่คนอื่นแนะนำ แหล่งใหญ่ที่สุดของความไม่ลงรอยกันในวันนี้คือแอพพลิเคชั่นที่ DllImport (หรือ P / Invoke) ลงในห้องสมุด Win32 แอสเซมบลีบางตัวไม่ได้ใช้งาน แต่ส่วนใหญ่ประกอบไปด้วย Windows เท่านั้นและไม่ได้ใช้งานบน Linux ฉันคิดว่ามันค่อนข้างปลอดภัยที่จะบอกว่าแอปพลิเคชัน ASP.NET ส่วนใหญ่สามารถทำงานบน Mono ด้วยการปรับเปลี่ยนที่ จำกัด

(การเปิดเผยข้อมูล: ฉันมีส่วนร่วมกับโมโนเช่นเดียวกับแอปที่เขียนขึ้นซึ่งทำงานบนสุดของมัน)


4
นั่นคือตัววิเคราะห์การโยกย้ายโมโนสำหรับทุกคนที่เกาหัวสงสัยว่าสิ่งนี้เกี่ยวข้องกับพิพิธภัณฑ์ศิลปะสมัยใหม่
Ferruccio

4

ในหลายกรณีคุณสามารถใช้รหัสที่มีอยู่และเรียกใช้บน Mono โดยเฉพาะอย่างยิ่งถ้าคุณกำลังย้ายแอปพลิเคชัน ASP.NET

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


4

เราได้ใช้มันสำหรับโครงการที่นี่ในที่ทำงานที่จำเป็นในการทำงานบน Linux แต่นำมาใช้ซ้ำบางไลบรารี. NET ที่เราสร้างขึ้นใน Managed C ++ ฉันรู้สึกประหลาดใจมากที่ได้ผลดี ปฏิบัติการหลักของเรากำลังเขียนใน C # และเราสามารถอ้างอิงไบนารีที่ได้รับการจัดการ C ++ ของเราโดยไม่มีปัญหา ข้อแตกต่างในรหัส C # ระหว่าง Windows และ Linux คือรหัสพอร์ตอนุกรม RS232

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


ดังนั้นคุณจะเขียนรหัสสำหรับพอร์ตอนุกรมที่จัดการทั้งสองได้อย่างไร ประเด็นทั้งหมดของ CLR / Mono นั้นต้องเป็นอิสระต่อกันใช่มั้ย สิ่งนี้ทำได้ในไฟล์กำหนดค่าหรือไม่?
ทิม

2

คุณรู้หรือไม่ว่าการสนับสนุนตัวอย่างโมโน 2.0 นั้นดีเพียงใดสำหรับ Windows Forms 2.0

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


2

ใช่แน่นอน (ถ้าคุณระมัดระวัง) เราสนับสนุน Mono ใน Ra-Ajax (ห้องสมุด Ajax ที่http://ra-ajax.org ) และเราส่วนใหญ่ไม่มีปัญหาเลย คุณต้องระวังด้วย "สิ่งที่บ้าที่สุด" จาก. Net เช่น WSE เป็นต้นและอาจมีบางโครงการที่คุณมีอยู่จะไม่สามารถใช้งานได้ 100% Mono แต่โครงการใหม่ถ้าคุณทดสอบในระหว่างการพัฒนาส่วนใหญ่จะเป็น เข้ากันได้โดยไม่มีปัญหากับโมโน และกำไรจากการสนับสนุนลีนุกซ์และอื่น ๆ ผ่านการใช้ Mono นั้นยอดเยี่ยมจริง ๆ ;)

ส่วนใหญ่ของความลับในการสนับสนุน Mono ฉันคิดว่าการใช้เครื่องมือที่เหมาะสมตั้งแต่เริ่มต้นเช่น ActiveRecord, log4net, ra-ajax ฯลฯ ...


2

สำหรับประเภทแอปพลิเคชันที่เรากำลังสร้าง Mono น่าเสียดายที่ดูเหมือนจะไม่พร้อมสำหรับการผลิต เราประทับใจกับมันโดยรวมและประทับใจกับประสิทธิภาพของมันทั้งบน Windows และบนเครื่อง EC2 อย่างไรก็ตามโปรแกรมของเราทำงานผิดพลาดอย่างสอดคล้องกับข้อผิดพลาดในการรวบรวมขยะทั้ง Windows และ Linux

ข้อความแสดงข้อผิดพลาดคือ: "ข้อผิดพลาดร้ายแรงใน GC: ส่วนฮีปมากเกินไป" ต่อไปนี้เป็นลิงก์ไปยังบุคคลอื่นที่ประสบปัญหาในลักษณะที่แตกต่างกันเล็กน้อย:

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

รหัสชิ้นแรกที่เรารันใน Mono คือความท้าทายในการเขียนโปรแกรมแบบง่าย ๆ ที่เราพัฒนา ... โค้ดโหลดประมาณ 10mb ข้อมูลลงในโครงสร้างข้อมูลบางอย่าง (เช่น HashSets) จากนั้นเรียกใช้ 10 แบบสอบถามต่อข้อมูล เราดำเนินการค้นหา 100 ครั้งเพื่อให้ได้เวลาและรับค่าเฉลี่ย

รหัสขัดข้องรอบการสืบค้น 55th บน Windows บน linux มันใช้งานได้ แต่ทันทีที่เราย้ายไปที่ชุดข้อมูลที่ใหญ่กว่ามันก็จะพังเช่นกัน

รหัสนี้ง่ายมากเช่นใส่ข้อมูลลงใน HashSets จากนั้นทำการค้นหา HashSets และอื่น ๆ ทั้งหมดในภาษาพื้นเมือง c # ไม่มีอะไรไม่ปลอดภัยไม่มีการเรียก API บน Microsoft CLR มันจะไม่ล้มเหลวและทำงานบนชุดข้อมูลขนาดใหญ่ 1,000 ครั้งได้ดี

หนึ่งในพวกเราส่งอีเมล Miguel และรวมถึงรหัสที่ทำให้เกิดปัญหายังไม่มีการตอบสนอง :(

ดูเหมือนว่าคนอื่น ๆ หลายคนเคยประสบปัญหานี้โดยไม่มีวิธีแก้ปัญหา - แนะนำวิธีแก้ไขปัญหาหนึ่งให้คอมไพล์โมโนด้วยการตั้งค่า GC ที่แตกต่างกัน แต่ดูเหมือนว่าจะเพิ่มเกณฑ์ก่อนที่มันจะล่ม


9
Bugzilla เป็นสถานที่รายงานข้อผิดพลาด: มิเกลยุ่งมากและไม่มีใครสามารถติดตามทุกคนที่ส่งรายงานข้อผิดพลาดให้เขา หากคุณไม่สามารถเผยแพร่รหัสตัวอย่างคุณยังควรรายงานปัญหาใน bugzilla และทราบว่าคุณส่งตัวอย่างไปที่ Miguel หรือฉัน (lupus@ximian.com)
lupus

2

เพียงตรวจสอบ www.plasticscm.com ทุกอย่าง (ไคลเอนต์เซิร์ฟเวอร์ GUI เครื่องมือผสาน) เขียนเป็นแบบโมโน


1

มันขึ้นอยู่กับ namespaces และคลาสที่คุณใช้จาก. NET Framework ฉันมีความสนใจในการแปลงหนึ่งในบริการ windows ของฉันเพื่อให้ทำงานบนเซิร์ฟเวอร์อีเมลของฉันซึ่งก็คือ Suse แต่เราวิ่งเข้าไปในสิ่งกีดขวางบนถนนที่ยากลำบากด้วย APIs ที่ยังไม่ได้ใช้งานอย่างสมบูรณ์ มีแผนภูมิอยู่ที่ใดที่หนึ่งบนเว็บไซต์โมโนที่แสดงรายการคลาสทั้งหมดและระดับความสมบูรณ์ หากใบสมัครของคุณได้รับการคุ้มครอง

เช่นเดียวกับแอปพลิเคชั่นอื่นทำการสร้างต้นแบบและทดสอบก่อนที่จะทำข้อตกลงทั้งหมด

ปัญหาอีกประการที่เราพบคือซอฟต์แวร์ลิขสิทธิ์: หากคุณอ้างถึง DLL ของคนอื่นคุณไม่สามารถเขียนรหัสวิธีแก้ไขปัญหาความไม่ลงรอยกันที่ฝังอยู่ในชุดประกอบ



1

ไม่โมโนไม่พร้อมสำหรับการทำงานอย่างจริงจัง ฉันเขียนโปรแกรมบางโปรแกรมบน Windows โดยใช้ F # และรันบน Mono โปรแกรมเหล่านั้นใช้ดิสก์หน่วยความจำและซีพียูค่อนข้างหนาแน่น ฉันเห็นข้อขัดข้องในไลบรารีขาวดำ (รหัสที่มีการจัดการ) การล่มในรหัสเนทีฟและการขัดข้องในเครื่องเสมือน เมื่อทำงานโมโนโปรแกรมก็ช้าลงอย่างน้อยสองเท่าใน. Net ใน Windows และใช้หน่วยความจำมากขึ้น อยู่ห่างจากโมโนสำหรับการทำงานอย่างจริงจัง


4
นี่คือหลักฐานพอสมควรที่นำเสนอตามความเป็นจริงและมาหาฉันเป็น FUD
firegrass

ที่จริง ASP.NET สามารถทำงานได้เร็วขึ้นภายใต้ nginx / fast-cgi กว่าบน IIS ทุกอย่างขึ้นอยู่กับสิ่งที่เป็นส่วนหนึ่งของกรอบรังเพลิง / ทดสอบอย่างดี: mono-project.com/Compatibility ต้องเห็นด้วยกับ @firegrass
Rui Marques

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