.NET Core vs Mono


257

อะไรคือความแตกต่างระหว่าง. NET Core และ Mono

ฉันพบคำแถลงเกี่ยวกับเว็บไซต์อย่างเป็นทางการที่กล่าวว่า: "โค้ดที่เขียนขึ้นสำหรับมันยังพกพาได้ในแอปพลิเคชันสแต็กเช่น Mono

เป้าหมายของฉันคือใช้ C #, LINQ, EF7 และ Visual Studio เพื่อสร้างเว็บไซต์ที่สามารถรัน / โฮสต์บน Linux

มีคนบอกฉันว่าเขาอยากให้มันเป็น "in Mono" แต่ฉันไม่รู้ว่ามันแปลว่าอะไร ฉันรู้ว่าฉันต้องการใช้. NET Core 1.0 กับเทคโนโลยีที่ฉันระบุไว้ข้างต้น เขายังบอกด้วยว่าเขาต้องการใช้ "CGI เร็ว" ฉันไม่รู้ว่านั่นหมายถึงอะไร

คุณสามารถช่วยฉันทำความเข้าใจเงื่อนไขเหล่านี้และความคาดหวังของฉันเป็นจริงได้หรือไม่?


2
ฉันไม่แน่ใจว่า. NET Core รองรับ Mono (หรือหากต้องการโมโนตอนนี้ด้วย) อย่างน้อยก็ไม่ใช่ทั้งหมด ดูที่นี่สำหรับสิ่งที่โมโนรองรับ FastCGI เป็นเพียงเซิร์ฟเวอร์ที่รันโค้ด ASP.NET ด้วยโมโน ตอนนี้ต้องบอกว่ามีเหตุผลพิเศษไหมที่คุณต้องรันบน Linux? หากไม่มีเหตุผลเร่งด่วน (นอกเหนือจากเพียงต้องการใช้ linux) ก็อาจจะดีกว่าที่จะคว้าเซิร์ฟเวอร์ windows เพื่อเรียกใช้รหัส. NET อย่างน้อยก็ในขณะนี้
Rob

ใช่เซิร์ฟเวอร์ที่โฮสต์อยู่จะเป็น linux แน่นอน ไม่มีตัวเลือกให้ใช้ windows server คุณบอกว่าคุณไม่แน่ใจว่า. รองรับ NET core บน Mono หรือไม่ แต่ฉันไม่รู้ว่าโมโนคืออะไร อะไรคือข้อโต้แย้งในการใช้. Net Core แทน Mono
Captainlonate

12
โดยทั่วไปแล้วเกี่ยวกับ mono คืออะไร: โดยพื้นฐานแล้วมันเป็นการใช้งานโอเพ่นซอร์สของไลบรารี. net (รวมถึงคอมไพล์และล่าม) ตัวอย่างเช่นเมื่อคุณเขียนMath.Pow(2, 3)- ไบนารีที่มีการดำเนินงานที่มีการปิดแหล่งที่มาและมีเพียงสำหรับ Windows บางคนตัดสินใจว่าพวกเขาชอบ. NET มากพอที่พวกเขาต้องการมันเพื่อ * ระวัง ดังนั้นพวกเขาจึงเขียนไบนารีไบนารีแบบปิดของตัวเอง จากนั้นพวกเขาเขียนคอมไพเลอร์และล่าม โมโนเป็นการนำกลับมาใช้ใหม่ของทุกสิ่งที่เคยปิดมาก่อนหน้านี้และเขียนขึ้นเพื่อทำงานบน windows / linux / osx
Rob

1
ฉันเขียนบล็อกโพสต์เมื่อปีที่แล้ว blog.lextudio.com/2015/12/…คุณสามารถใช้อย่างใดอย่างหนึ่ง แต่. NET Core จะเป็นอนาคตที่สดใส
Lex Li

3
คำว่า "Core" ใน ".NET Core" อาจเป็นสาเหตุของความเข้าใจผิด ให้ชื่อที่เหมาะสมกับลูกน้อยของคุณ!
อ้วนเกินไปไม่มีคอ

คำตอบ:


256

Necromancing
ให้คำตอบที่แท้จริง

อะไรคือความแตกต่างระหว่าง. Net Core และ Mono

. NET Core ในขณะนี้อย่างเป็นทางการคืออนาคตของ. NET ส่วนใหญ่เริ่มต้นด้วยการเขียนเฟรมเวิร์กASP.NETและแอปพลิเคชันคอนโซลอีกครั้งซึ่งแน่นอนว่ารวมถึงแอปพลิเคชันเซิร์ฟเวอร์ด้วย (เนื่องจากเป็นทัวริงที่สมบูรณ์และรองรับการทำงานร่วมกันกับ C dll คุณสามารถทำได้ถ้าคุณต้องการเขียนแอปพลิเคชันเดสก์ท็อปของคุณด้วยเช่นผ่านห้องสมุดของบุคคลที่สามเช่นAvaloniaซึ่งค่อนข้างพื้นฐานในเวลาที่ฉันเขียนสิ่งนี้ครั้งแรกซึ่งหมายความว่าคุณค่อนข้าง จำกัด เนื้อหาเว็บหรือเซิร์ฟเวอร์) เมื่อเวลาผ่านไปมีการเพิ่ม API จำนวนมากใน. NET Core ดังนั้นหลังจากรุ่น 3.1 .NET Core จะข้ามไปเป็นเวอร์ชัน 5.0 เรียกว่า. NET 5.0 โดยไม่มี "Core" และจากนั้นจะเป็นอนาคตของ. NET Framework สิ่งที่เคยเป็น. NET Framework แบบเต็มจะอวดอ้างในโหมดการบำรุงรักษาแบบเต็ม. NET Framework 4.8.x ไม่กี่ทศวรรษจนกว่ามันจะตาย (อาจจะยังคงมีการอัพเกรดบางอย่าง แต่ฉันสงสัย) ในคำอื่น ๆ .NET หลักคืออนาคตของ .NET และเต็ม .NET Framework จะไปทางของนกโดโด

จุดหลักของ. NET Core นอกเหนือจากการรองรับหลายแพลตฟอร์มคือการปรับปรุงประสิทธิภาพและเพื่อเปิดใช้งาน "native compilation" / การปรับใช้ในตัวเอง (ดังนั้นคุณไม่จำเป็นต้องติดตั้ง. NET Framework / VM บนเครื่องเป้าหมาย .
ในมือข้างหนึ่งที่นี้หมายถึง docker.io สนับสนุนในลินุกซ์และอื่น ๆ การใช้งานอยู่ในตัวเองจะเป็นประโยชน์ใน "คอมพิวเตอร์เมฆ" ตั้งแต่นั้นมาคุณก็สามารถใช้สิ่งที่รุ่นของกรอบ dotnet-core ที่คุณต้องการ และคุณไม่ต้องกังวลกับเวอร์ชันของ sysadmin ใด ๆ ที่ติดตั้งเฟรมเวิร์ก. NET

ในขณะที่รันไทม์. NET Core รองรับระบบปฏิบัติการและโปรเซสเซอร์หลายตัว SDK เป็นเรื่องราวที่แตกต่าง และในขณะที่ SDK รองรับระบบปฏิบัติการหลายระบบการสนับสนุน ARM สำหรับ SDK คือ / ยังคงทำงานอยู่ .NET Core รองรับโดย Microsoft Dotnet-Core ไม่ได้มาพร้อมกับ WinForms หรือ WPF หรืออะไรทำนองนั้น

  • ในฐานะของเวอร์ชัน 3.0, WinForms และ WPF ยังรองรับโดย. NET Core แต่เฉพาะใน Windows และเฉพาะ C # ไม่ใช่โดย VB.NET (รองรับ VB.NET ที่วางแผนไว้สำหรับ v5 ในปี 2020) และไม่มีตัวออกแบบฟอร์มใน. NET Core: จะมีการจัดส่งพร้อมกับการปรับปรุง Visual Studio ในภายหลังในเวลาที่ไม่ระบุ
  • WebForms ยังคงไม่รองรับโดย. NET Core และไม่มีแผนรองรับพวกเขาเลยทีเดียว ( Blazorเป็นเด็กใหม่ในเมืองสำหรับเรื่องนี้)
  • .NET Core ยังมาพร้อมกับ System.Runtime ซึ่งแทนที่ mscorelib
  • บ่อยครั้งที่. NET Core จะถูกรวมเข้ากับNetStandardซึ่งเป็นตัวห่อหุ้มรอบ ๆ System.Runtime / mscorelib (และอื่น ๆ ) ที่ช่วยให้คุณเขียนไลบรารีที่มีเป้าหมาย. NET Core,. NET Framework แบบเต็มและ Xamarin (iOS) / Android) ทั้งหมดพร้อมกัน
  • .NET Core SDK ไม่ได้ / ไม่ทำงานบน ARM อย่างน้อยก็ไม่ได้ล่าสุดที่ฉันตรวจสอบ

" โครงการโมโน "นั้นเก่ากว่า. NET Core มาก
โมโนเป็นภาษาสเปนและมีความหมายว่าลิงและเป็นชื่อที่ไม่มีส่วนเกี่ยวข้องกับ mononucleosis (คำใบ้: คุณสามารถรับรายชื่อพนักงานภายใต้http://primates.ximian.com /)
Mono เริ่มต้นในปี 2005 โดยMiguel de Icaza (คนที่เริ่มGNOME - และอื่น ๆ อีกสองสามคน) เป็นการใช้งาน. NET Framework for Linux (Ximian / SuSe / Novell) Mono รวมถึงเว็บฟอร์ม Winforms, MVC, Olive และ IDE ที่เรียกว่าMonoDevelop(หรือที่รู้จักในชื่อ Xamarin Studio หรือ Visual Studio Mac) โดยทั่วไปเทียบเท่ากับ (OpenJDK) JVM และ (OpenJDK) JDK / JRE (ตรงข้ามกับ SUN / Oracle JDK) คุณสามารถใช้มันเพื่อรับแอปพลิเคชัน ASP.NET-WebForms + WinForms + ASP.NET-MVC เพื่อทำงานบน Linux

โมโนได้รับการสนับสนุนโดย Xamarin (ชื่อ บริษัท ใหม่ของสิ่งที่เคยเป็น Ximian เมื่อพวกเขามุ่งเน้นไปที่ตลาดมือถือแทนที่จะเป็นตลาด Linux) และไม่ใช่โดย Microsoft
(เนื่องจาก Xamarin ถูกซื้อโดย Microsoft นั่นเป็นเทคนิค (แต่ไม่ใช่ทางวัฒนธรรม) Microsoft)
โดยทั่วไปคุณจะได้รับข้อมูล C # ของคุณเพื่อคอมไพล์ในโมโน แต่ไม่ใช่ VB.NET
Mono คิดถึงคุณสมบัติขั้นสูงบางอย่างเช่น WSE / WCF และ WebParts
การใช้งานโมโนหลายอย่างไม่สมบูรณ์ (เช่นการโยน NotImplementedException ในการเข้ารหัส ECDSA), buggy (เช่น ODBC / ADO.NET ด้วย Firebird) ทำงานแตกต่างจากใน NET (ตัวอย่างเช่น XML-serialization) หรือไม่เสถียร (ASP.NET MVC) และช้าจนไม่อาจยอมรับได้ (Regex) กลับหัวกลับหาง, toolchain โมโนยังทำงานบน ARM

ตราบใดที่. NET Core เป็นห่วงเมื่อพวกเขาพูดข้ามแพลตฟอร์มอย่าคาดหวังว่าข้ามแพลตฟอร์มหมายความว่าคุณสามารถทำได้เพียงติดตั้ง. NET Core บน ARM-Linux อย่างที่คุณทำได้ด้วย ElasticSearch คุณจะต้องรวบรวมกรอบทั้งหมดจากแหล่งที่มา
นั่นคือถ้าคุณมีพื้นที่นั้น (เช่นใน Chromebook ซึ่งมี HD ทั้งหมด 16 ถึง 32 GB)
นอกจากนี้ยังเคยมีปัญหาความไม่ลงรอยกันกับ OpenSSL 1.1 และ libcurl
สิ่งเหล่านี้ได้รับการแก้ไขใน. NET Core เวอร์ชัน 2.2 ล่าสุด
มากสำหรับข้ามแพลตฟอร์ม

ฉันพบคำแถลงเกี่ยวกับเว็บไซต์อย่างเป็นทางการที่กล่าวว่า "โค้ดที่เขียนขึ้นสำหรับมันยังพกพาได้ทั่วทั้งแอปพลิเคชันเช่น Mono"

ตราบใดที่รหัสนั้นไม่ใช้การเรียก WinAPI, Windows-dll-pinvokes, COM-Components, ระบบไฟล์ที่ไม่ต้องใช้ตัวพิมพ์เล็ก - ใหญ่, การเข้ารหัสระบบเริ่มต้น (codepage) และไม่มีปัญหาเกี่ยวกับตัวคั่นไดเรกทอรี แก้ไข. อย่างไรก็ตามรหัส. NET Core ทำงานบน. NET Core ไม่ใช่ใน Mono ดังนั้นการผสมทั้งสองจะเป็นเรื่องยาก และเนื่องจาก Mono ค่อนข้างไม่เสถียรและช้า (สำหรับเว็บแอปพลิเคชัน) ฉันจึงไม่แนะนำเลย ลองประมวลผลภาพบน. NET core เช่น WebP หรือย้าย GIF หรือหลายหน้าจอหรือเขียนข้อความบนภาพคุณจะต้องประหลาดใจอย่างน่าประหลาดใจ

หมายเหตุ:
ตั้งแต่. NET Core 2.0 มี System.Drawing.Common (NuGet) ซึ่งมีฟังก์ชันการทำงานส่วนใหญ่ของ System.Drawing มันควรจะมีคุณสมบัติครบถ้วนมากกว่าหรือน้อยกว่าใน. NET-Core 2.1 อย่างไรก็ตาม System.Drawing.Common ใช้ GDI + และดังนั้นจึงจะไม่ทำงานบน Azure (ห้องสมุด System.Drawing ที่มีอยู่ในบริการ Azure เมฆ [พื้นเพียง VM] แต่ไม่ได้อยู่ใน Azure Web App [ใช้ร่วมกันโดยทั่วไปโฮสติ้ง?])
ดังนั้น ไกล System.Drawing.Common ทำงานได้ดีบน Linux / Mac แต่มีปัญหาเกี่ยวกับ iOS / Android - ถ้ามันทำงานได้ทุกที่นั่น
ก่อนหน้า. NET Core 2.0 กล่าวคือบางช่วงกลางเดือนกุมภาพันธ์ 2017 คุณสามารถใช้SkiaSharpเพื่อถ่ายภาพ(ตัวอย่าง) (คุณยังสามารถทำได้)
โพสต์. net-core 2.0 คุณจะสังเกตเห็นว่าSixLabors ImageSharpเป็นวิธีที่จะไปเนื่องจาก System.Drawing ไม่ปลอดภัยและจำเป็นต้องมีหน่วยความจำรั่วหรือหน่วยความจำเกิดขึ้นจริงซึ่งเป็นเหตุผลว่าทำไมคุณไม่ควรใช้ GDI ในเว็บแอปพลิเคชัน โปรดทราบว่า SkiaSharp นั้นเร็วกว่า ImageSharp มากเพราะใช้ Native-libraries (ซึ่งอาจเป็นข้อเสียเปรียบ) นอกจากนี้โปรดทราบว่าขณะที่ GDI + ทำงานบน Linux & Mac นั่นไม่ได้หมายความว่าทำงานบน iOS / Android

รหัสที่ไม่ได้เขียนสำหรับ. NET (ไม่ใช่คอร์) ไม่สามารถพกพาไปยัง. NET Core ได้
หมายความว่าถ้าคุณต้องการไลบรารี่ที่ไม่ใช่ GPL C # เช่น PDFSharp เพื่อสร้างเอกสาร PDF (ธรรมดามาก) คุณจะโชคไม่ดี(ในขณะนี้)( ไม่ใช่อีกต่อไป ) ไม่ต้องกังวลกับการควบคุม ReportViewer ซึ่งใช้ Windows-pInvokes (เพื่อเข้ารหัสสร้างเอกสาร mcdf ผ่าน COM และรับแบบอักษรตัวอักษรการจัดช่องข้อมูลการฝังแบบอักษรแบบอักษรการวัดสตริงและการแตกบรรทัดและสำหรับการวาดคุณภาพที่ยอมรับได้จริง) และไม่แม้แต่จะเรียกใช้บน Mono บน Linux
( ฉันกำลังทำอยู่ )

นอกจากนี้โค้ดที่เขียนใน. NET Core ไม่สามารถพกพาไปยัง Mono ได้เพราะ Mono ไม่มีไลบรารีรันไทม์. NET Core (จนถึงตอนนี้)

เป้าหมายของฉันคือใช้ C #, LINQ, EF7, visual studio เพื่อสร้างเว็บไซต์ที่สามารถวิ่ง / โฮสต์ใน linux

EF ในทุกรุ่นที่ฉันพยายามมาถึงตอนนี้ช้ามาก (แม้ในสิ่งที่เรียบง่ายเช่นโต๊ะเดียวที่มีหนึ่งซ้ายเข้าร่วม) ฉันไม่อยากจะแนะนำเลย - ไม่ใช่บน Windows เช่นกัน
ฉันจะไม่แนะนำ EF โดยเฉพาะหากคุณมีฐานข้อมูลที่มีข้อ จำกัด เฉพาะหรือคอลัมน์ varbinary / filestream / hierarchyid (ไม่ใช่สำหรับ schema-update เช่นกัน)
และยังไม่ได้อยู่ในสถานการณ์ที่ประสิทธิภาพของฐานข้อมูลเป็นสิ่งสำคัญ (พูดกับผู้ใช้งานพร้อมกันตั้งแต่ 10+ ถึง 100+)
นอกจากนี้การใช้งานเว็บไซต์ / แอปพลิเคชันบน Linux จะช้าลงเรื่อย ๆ หมายความว่าคุณจะต้องแก้ไขข้อบกพร่อง
ไม่มีการสนับสนุนการดีบักสำหรับ. NET Core บน Linux(ไม่ใช่อีกต่อไป แต่ต้องการ JetBrains Rider)
MonoDevelop ไม่สนับสนุนการดีบักโครงการ. NET Core
หากคุณมีปัญหาแสดงว่าคุณเป็นเจ้าของ คุณจะต้องใช้การบันทึกที่กว้างขวาง
โปรดใช้ความระมัดระวังและให้คำแนะนำอย่างละเอียดการบันทึกข้อมูลจะช่วยเติมดิสก์ของคุณในเวลาไม่นานโดยเฉพาะอย่างยิ่งหากโปรแกรมของคุณเข้าสู่วงวนไม่สิ้นสุดหรือการเรียกซ้ำ
สิ่งนี้เป็นสิ่งที่อันตรายโดยเฉพาะอย่างยิ่งหากแอปพลิเคชันเว็บของคุณทำงานเป็นรูทเนื่องจากการลงชื่อเข้าใช้ต้องใช้พื้นที่ไฟล์ logfile หากไม่มีพื้นที่ว่างเหลืออยู่คุณจะไม่สามารถลงชื่อเข้าใช้ได้อีกต่อไป
(โดยปกติประมาณ 5% ของพื้นที่ดิสก์สงวนไว้สำหรับผู้ใช้รูท [ผู้ดูแลระบบ aka บน Windows] ดังนั้นอย่างน้อยผู้ดูแลระบบยังสามารถเข้าสู่ระบบได้หากดิสก์เกือบเต็ม แต่ถ้าแอปพลิเคชันของคุณทำงานเป็นรูท การใช้ดิสก์และ logfiles สามารถใช้พื้นที่ว่างที่เหลือได้ 100% ดังนั้นแม้กระทั่งผู้ดูแลระบบสามารถเข้าสู่ระบบได้อีก)
ดังนั้นจึงเป็นการดีกว่าที่จะไม่เข้ารหัสดิสก์นั่นคือถ้าคุณให้ความสำคัญกับข้อมูล / ระบบของคุณ

มีคนบอกฉันว่าเขาอยากให้มันเป็น "in Mono" แต่ฉันไม่รู้ว่ามันแปลว่าอะไร

หมายความว่าเขาไม่ต้องการใช้. NET Core หรือเขาแค่ต้องการใช้ C # บน Linux / Mac ฉันเดาว่าเขาแค่ต้องการใช้ C # สำหรับ Web-App บน Linux .NET Core คือหนทางที่จะนำไปสู่สิ่งนั้นหากคุณต้องการทำใน C # อย่าไปกับ "โมโนที่เหมาะสม"; ดูเหมือนว่าจะใช้งานได้ในตอนแรก แต่เชื่อฉันว่าคุณจะต้องเสียใจเพราะ ASP.NET MVC ของ Mono ไม่เสถียรเมื่อเซิร์ฟเวอร์ของคุณทำงานในระยะยาว (นานกว่า 1 วัน) - คุณได้รับคำเตือนแล้ว ดูการอ้างอิง "ไม่สมบูรณ์" เมื่อทำการวัดประสิทธิภาพโมโนบนการวัดประสิทธิภาพของเทคโนโลยี

โชคชะตา

ฉันรู้ว่าฉันต้องการใช้. Net Core 1.0 framework กับเทคโนโลยีที่ฉันระบุไว้ข้างต้น เขายังบอกด้วยว่าเขาต้องการใช้ "fast cgi" ฉันไม่รู้ว่านั่นหมายถึงอะไร

หมายความว่าเขาต้องการใช้ WebServer เต็มรูปแบบประสิทธิภาพสูงเช่น nginx (Engine-X) ซึ่งอาจเป็น Apache
จากนั้นเขาสามารถเรียกใช้ mono / dotnetCore ด้วยชื่อโฮสต์เสมือน (หลายชื่อโดเมนใน IP เดียวกัน) และ / หรือโหลดบาลานซ์ เขายังสามารถเรียกใช้เว็บไซต์อื่น ๆ ด้วยเทคโนโลยีอื่น ๆ โดยไม่ต้องใช้หมายเลขพอร์ตอื่นบนเว็บเซิร์ฟเวอร์ หมายความว่าเว็บไซต์ของคุณทำงานบน fastcgi-server และ nginx ส่งต่อคำขอทางเว็บทั้งหมดสำหรับโดเมนที่ระบุผ่าน fastcgi-protocol ไปยังเซิร์ฟเวอร์นั้น นอกจากนี้ยังหมายถึงเว็บไซต์ของคุณทำงานใน fastcgi-pipeline และคุณต้องระวังสิ่งที่คุณทำเช่นคุณไม่สามารถใช้ HTTP 1.1 เมื่อทำการส่งไฟล์
มิฉะนั้นไฟล์จะถูกอ่านไม่ออกที่ปลายทาง
ดูเพิ่มเติมที่นี่และที่นี่

เพื่อสรุป:
. NET Core ในปัจจุบัน (2016-09-28) ไม่สามารถพกพาได้จริงและไม่เป็นแพลตฟอร์มข้ามแพลตฟอร์ม (โดยเฉพาะอย่างยิ่งเครื่องมือดีบัก)
การรวบรวมแบบเนทีฟนั้นง่ายมากโดยเฉพาะกับ ARM
และสำหรับฉันมันก็ไม่ได้ดูเหมือนว่าการพัฒนาของมันจะเป็น "เสร็จจริงๆ" แต่
ตัวอย่างเช่น System.Data.DataTable / DataAdaper.Update ขาดหายไป ... (ไม่ได้อยู่กับ. NET Core 2.0 อีกต่อไป)
ร่วมกับส่วนต่อประสาน System.Data.Common.IDB *(ไม่ใช่กับ. NET Core 1.1 อีกต่อไป)
หากเคยมีคลาสหนึ่งที่ใช้บ่อย DataTable / DataAdapter จะเป็นเช่นนั้น ...
นอกจากนี้ตัวติดตั้ง Linux (.deb) ก็ล้มเหลวอย่างน้อยในเครื่องของฉันและฉัน ' ฉันแน่ใจว่าฉันไม่ใช่คนเดียวที่มีปัญหานั้น
แก้ไขข้อผิดพลาดหรืออาจใช้ Visual Studio Code หากคุณสามารถสร้างมันบน ARM (ฉันสามารถทำเช่นนั้นได้ - อย่าติดตามบล็อกโพสต์ของ Scott Hanselman ถ้าคุณทำเช่นนั้น - มีวิธีการในวิกิของ VS-Code บน gitub) เพราะ พวกเขาไม่เสนอปฏิบัติการ
Yeoman ก็ล้มเหลวเช่นกัน (ฉันเดาว่ามันมีบางอย่างที่เกี่ยวข้องกับรุ่น nodejs ที่คุณติดตั้ง - รหัส VS ต้องใช้รุ่นหนึ่ง Yeoman อีกรุ่น ... แต่มันควรจะทำงานบนคอมพิวเตอร์เครื่องเดียวกันค่อนข้างง่อย ไม่เป็นไรว่าไม่ควรพึ่งพา NodeJS ในครั้งแรก สถานที่.
ไม่เป็นไรว่ามันควรจะทำงานกับรุ่นโหนดที่จัดส่งโดยค่าเริ่มต้น บนระบบปฏิบัติการ

เซิร์ฟเวอร์ kestell ยังทำงานอยู่
และตัดสินจากประสบการณ์ของฉันกับโครงการโมโนฉันสงสัยอย่างมากว่าพวกเขาเคยทดสอบ. NET Core บน FastCGI หรือว่าพวกเขามีความคิดใด ๆ ที่ FastCGI สนับสนุนหมายถึงเฟรมเวิร์กของพวกเขานับประสาที่พวกเขาทดสอบเพื่อให้แน่ใจว่า " อันที่จริงฉันเพิ่งลองสร้าง fastcgi-application กับ. NET Core และเพิ่งรู้ว่าไม่มีห้องสมุด FastCGI สำหรับ. NET Core "RTM" ...

ดังนั้นเมื่อคุณกำลังเรียกใช้. NET Core "RTM" หลัง nginx คุณสามารถทำได้โดย proxying การร้องขอไปยัง kestrell (เว็บเซิร์ฟเวอร์ที่ได้รับมาจากโหนด JSS กึ่งสำเร็จรูป) - ไม่มีการสนับสนุน fastcgi ใน. NET Core "RTM", AFAIK เนื่องจากไม่มีไลบรารี fastcgi core. net และไม่มีตัวอย่างจึงไม่น่าเป็นไปได้อย่างยิ่งที่ทุกคนจะทำการทดสอบเฟรมเวิร์กเพื่อให้แน่ใจว่า fastcgi ทำงานได้อย่างที่คาดไว้

ฉันยังถามถึงประสิทธิภาพ
ในเทคโนโลยีขั้นต้น (เบื้องต้น) (มาตรฐานรอบ 13) , aspnetcore-linux จัดอันดับอยู่ที่ 25% เมื่อเทียบกับประสิทธิภาพที่ดีที่สุดในขณะที่เฟรมเวิร์กที่เทียบเคียงกันได้เช่น Go (golang) อยู่ที่ 96.9% ของประสิทธิภาพสูงสุด - การเข้าถึงระบบเท่านั้น) . NET Core จะดีขึ้นเล็กน้อยในการทำให้เป็นอนุกรม JSON แต่มันก็ดูไม่น่าสนใจอย่างใดอย่างหนึ่ง (ไปถึง 98.5% ของจุดสูงสุด,. NET core 65%) ที่กล่าวว่ามันอาจจะไม่เลวร้ายยิ่งกว่า "เหมาะสมขาวดำ"

นอกจากนี้เนื่องจากมันยังค่อนข้างใหม่ห้องสมุดหลักบางแห่งจึงไม่ได้รับการย้าย (แต่) และฉันสงสัยว่าบางคนจะถูกย้ายเข้า
การสนับสนุนด้านการถ่ายภาพนั้นยังเป็นปัญหาที่ดีที่สุด
สำหรับการเข้ารหัสใด ๆ ให้ใช้ BouncyCastle แทน

คุณสามารถช่วยฉันทำความเข้าใจเงื่อนไขเหล่านี้และความคาดหวังของฉันเป็นจริงได้หรือไม่?

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

การทำสิ่งเหล่านี้ทั้งหมดบนแพลตฟอร์ม "ทดลอง" โดยไม่มีความรู้เฉพาะของแพลตฟอร์มนั้นและไม่มีการสนับสนุนการดีบักเป็นการฆ่าตัวตายหากโครงการของคุณเป็นมากกว่าหน้าแรกส่วนบุคคล ในทางกลับกันฉันเดาว่าการทำมันด้วยโฮมเพจส่วนตัวของคุณเพื่อจุดประสงค์ในการเรียนรู้อาจเป็นประสบการณ์ที่ดีมาก - จากนั้นคุณจะได้รู้ว่ากรอบงานและปัญหาที่ไม่ใช่กรอบคืออะไร
คุณสามารถยกตัวอย่างเช่น (โดยทางโปรแกรม) ลูปเมาต์ case-insensitive fat32, hfs หรือ JFS สำหรับแอปพลิเคชันของคุณเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับ case-sensitive (loop-mount ไม่แนะนำในการผลิต)

เพื่อสรุป
ในปัจจุบัน (2016-09-28) ฉันจะอยู่ห่างจาก. NET Core (สำหรับการใช้งานจริง) บางทีในหนึ่งถึงสองปีคุณสามารถดูอีกครั้ง แต่อาจไม่ก่อน
หากคุณมีโครงการเว็บใหม่ที่คุณพัฒนาให้เริ่มใน. NET Core ไม่ใช่โมโน Goglandบน Linux (และ Windows และ Mac) กระบวนการสร้างของ Golang (และรันไทม์) ก็ไม่ได้ขึ้นอยู่กับ NodeJS ซึ่งเป็นข้อดีอีกอย่างหนึ่ง

หากคุณต้องการกรอบการทำงานที่ทำงานบน Linux (x86 / AMD64 / ARMhf) และ Windows และ Mac ที่ไม่มีการพึ่งพาเช่นการเชื่อมโยงแบบคงที่เท่านั้นและไม่มีการพึ่งพาบน. NET, Java หรือ Windows ให้ใช้ Golang แทน เป็นผู้ใหญ่มากขึ้นและประสิทธิภาพได้รับการพิสูจน์ (Baidu ใช้กับผู้ใช้พร้อมกัน 1 ล้านคน) และ golang มีหน่วยความจำที่ต่ำกว่าอย่างเห็นได้ชัด นอกจากนี้ golang ยังอยู่ในที่เก็บ.. deb ติดตั้งโดยไม่มีปัญหาซอร์สโค้ดคอมไพล์ - โดยไม่ต้องการการเปลี่ยนแปลง - และ golang (ในระหว่างนี้) มีการดีบักการรองรับ delve และ JetBrains

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

การอัปเดตธันวาคม 2559: การ
รวบรวมเนทีฟถูกลบออกจาก. NET Core พรีวิวเนื่องจากยังไม่พร้อม ...

ดูเหมือนว่าพวกเขาได้รับการปรับปรุงอย่างหนักในเกณฑ์มาตรฐานไฟล์ข้อความดิบ แต่ในทางกลับกันมันค่อนข้างบ้า นอกจากนี้ยังลดลงในเกณฑ์มาตรฐาน JSON อยากรู้ว่าเฟรมเวิร์กเอนทิตี้ของจะต้องเร็วกว่าการอัพเดตมากกว่า Dapper - แม้ว่าทั้งสองจะทำงานช้ากว่าเดิม สิ่งนี้ไม่น่าจะเป็นจริงได้ ดูเหมือนว่ายังคงมีมากกว่าข้อบกพร่องเพียงเล็กน้อยที่จะตามล่า

นอกจากนี้ดูเหมือนว่าจะมีการผ่อนปรนที่ด้านหน้า Linux IDE
JetBrains เปิดตัว "Project Rider" ตัวอย่างการเข้าถึงก่อนหน้าของ C # /. NET Core IDE สำหรับ Linux (และ Mac และ Windows) ที่สามารถจัดการไฟล์ Visual Studio Project ได้ ในที่สุด C # IDE ที่ใช้งานได้ & นั่นก็ไม่ช้าเหมือนนรก

บทสรุป:. NET Core ยังคงเป็นซอฟต์แวร์ที่มีคุณภาพก่อนวางจำหน่ายเมื่อเราเข้าสู่ปีพ. ศ. 2560 ย้ายไลบรารี่ของคุณออกไป แต่ควรอยู่ห่างจากมันเพื่อการใช้งานจริงจนกว่าคุณภาพของเฟรมจะเสถียร
และจับตาดู Project Rider

buggy. net core

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

คุณสามารถเรียกใช้

dotnet restore -r win81-x64
dotnet build -r win81-x64
dotnet publish -f netcoreapp1.1 -c Release -r win81-x64

หมายเหตุ: เป็นต่อ .NET หลัก 3 คุณสามารถเผยแพร่ทุกอย่างที่ลดขนาดลงเป็นไฟล์เดียว :

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
dotnet publish -r linux-x64 -c Release /p:PublishSingleFile=true

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

และคุณได้รับไฟล์. exe ที่บรรจุในตัว (ในไดเรกทอรีเผยแพร่) ซึ่งคุณสามารถย้ายไปยังเครื่อง Windows 8.1 โดยไม่ต้องติดตั้ง. NET Framework และปล่อยให้มันทำงาน ดี ที่นี่ที่ dotNET-Core เพิ่งเริ่มได้รับความสนใจ (คำนึงถึงช่องว่าง SkiaSharp ไม่ทำงานบน Windows 8.1 / Windows Server 2012 R2, [ยัง] - ระบบนิเวศต้องติดตามก่อน - แต่น่าสนใจ Skia-dll-load-fail ไม่ได้ขัดข้องทั้งเซิร์ฟเวอร์ / แอปพลิเคชัน - เพื่อให้ทุกอย่างทำงานได้)

(หมายเหตุ: SkiaSharp บน Windows 8.1 ไม่มีไฟล์รันไทม์ VC ที่เหมาะสม - msvcp140.dll และ vcruntime140.dll คัดลอกลงในไดเรกทอรีเผยแพร่และ Skia จะทำงานบน Windows 8.1)

อัปเดตเมื่อสิงหาคม 2560
เปิดตัว. NET Core 2.0
โปรดใช้ความระมัดระวัง - มาพร้อมกับการเปลี่ยนแปลงการรับรองความถูกต้อง (ที่มีจำนวนมาก) ...
กลับหัวกลับหางจะนำคลาส DataTable / DataAdaper / DataSet กลับมาและอีกมากมาย
Realized .NET Core ยังคงขาดการสนับสนุน Apache SparkSQL เนื่องจากMobiusยังไม่ได้รับการจัดพอร์ต ไม่ดีเพราะนั่นหมายความว่าไม่มีการสนับสนุน SparkSQL สำหรับ IoT Cassandra Cluster ของฉันดังนั้นจึงไม่ได้เข้าร่วม ...
สนับสนุน ARM Experimental (รันไทม์เท่านั้นไม่ใช่ SDK - แย่เกินไปสำหรับการพัฒนาบน Chromebook ของฉัน - รอคอยที่ 2.1 หรือ 3.0)
PdfSharp ถูกย้ายไปยัง. NET Core ในขณะนี้
JetBrains Riderออกจาก EAP ตอนนี้คุณสามารถใช้เพื่อพัฒนาและแก้ไขข้อบกพร่อง. NET Core บน Linux - แม้ว่าจะเป็นเพียงแค่. NET Core 1.1 จนถึงการปรับปรุงสำหรับการสนับสนุน. NET Core 2.0

พฤษภาคม 2018 อัพเดต
. NET Core 2.1 ที่ใกล้เข้ามา บางทีนี่อาจจะแก้ไขการรับรองความถูกต้องของ NTLM บน Linux (การรับรองความถูกต้องของ NTLM ไม่ทำงานบน Linux {และอาจเป็น Mac} ใน. NET-Core 2.0 ที่มีหลายส่วนหัวรับรองความถูกต้องเช่นเจรจาต่อรองส่งทั่วไปด้วย ms-exchange แก้ไขใน v2.1 เท่านั้นไม่มีการแก้ไขข้อผิดพลาดสำหรับ 2.0)
แต่ฉันไม่ได้ติดตั้งรุ่นตัวอย่างในเครื่องของฉัน ดังนั้นรอ
v2.1 ได้รับการกล่าวเพื่อลดเวลาในการคอมไพล์ นั่นจะเป็นสิ่งที่ดี

นอกจากนี้โปรดทราบว่าบน Linux, .NET Core เป็น64 บิตเท่านั้น !
ไม่มีและจะไม่มีรุ่น x86-32 ของ .NET หลักบน Linux
และพอร์ต ARM คือ ARM-32 เท่านั้น ยังไม่มี ARM-64
และบน ARM คุณ (ปัจจุบัน) มีเพียงรันไทม์ไม่ใช่ dotnet-SDK

และอีกสิ่งหนึ่ง:
เนื่องจาก. NET-Core ใช้ OpenSSL 1.0,. NET Core บน Linux ไม่ได้ทำงานบน Arch Linux และโดยไม่ได้มาจาก Manjaro (Linux distro ที่ได้รับความนิยมมากที่สุดในขณะนี้) เนื่องจาก Arch Linux ใช้ OpenSSL 1.1 ดังนั้นถ้าคุณใช้ Arch Linux คุณก็โชคไม่ดี (กับ Gentoo ด้วย)

แก้ไข:

.NET Core 2.2+ เวอร์ชันล่าสุดรองรับ OpenSSL 1.1 ดังนั้นคุณสามารถใช้กับ Arch หรือ (k) Ubuntu 19.04+ คุณอาจต้องใช้สคริปต์การติดตั้ง. NET-Coreเนื่องจากยังไม่มีแพ็คเกจ

ในทางกลับกันประสิทธิภาพได้ดีขึ้นอย่างแน่นอน: โชคชะตา

ข้อความธรรมดา

.NET Core 3:
.NET-Core v 3.0 ถูกกล่าวเพื่อนำ WinForms และ WPF ไปยัง. NET-Core
อย่างไรก็ตามในขณะที่ WinForms และ WPF จะเป็น. NET Core, WinForms และ WPF ใน. NET-Core จะทำงานบน Windows เท่านั้นเนื่องจาก WinForms / WPF จะใช้ Windows-API

หมายเหตุ:
ขณะนี้. NET Core 3.0 ไม่ทำงาน (RTM) และมีการสนับสนุน WinForms และ WPF แต่สำหรับ C # (บน Windows) เท่านั้น นอกจากนี้ไม่มี WinForms-Core-ออกแบบ ในที่สุดนักออกแบบก็จะมาพร้อมกับการอัปเดต Visual Studio, ค้างคาว สนับสนุน WinForms สำหรับVB.NET ไม่สนับสนุนแต่มีการวางแผนสำหรับ NET 5.0 somewhen ใน2020

PS:

echo "DOTNET_CLI_TELEMETRY_OPTOUT=1" >> /etc/environment
export DOTNET_CLI_TELEMETRY_OPTOUT=1 

หากคุณใช้มันในหน้าต่างคุณอาจไม่เคยเห็นสิ่งนี้:

เครื่องมือ. NET Core รวบรวมข้อมูลการใช้งานเพื่อปรับปรุงประสบการณ์ของคุณ
ข้อมูลไม่ระบุชื่อและไม่รวมอาร์กิวเมนต์บรรทัดคำสั่ง
Microsoft รวบรวมข้อมูลและแบ่งปันกับชุมชน
คุณสามารถเลือกไม่ใช้ telemetry ได้โดยตั้งค่าตัวแปรสภาพแวดล้อม DOTNET_CLI_TELEMETRY_OPTOUT เป็น 1 โดยใช้เชลล์ที่คุณชื่นชอบ
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเครื่องมือ .NET หลัก telemetry @ https://aka.ms/dotnet-cli-telemetry

ฉันคิดว่าฉันพูดถึงว่าฉันคิดว่า monodevelop (หรือที่รู้จักกันในชื่อ Xamarin Studio, Mono IDE หรือ Visual Studio Mac ซึ่งตอนนี้เรียกว่าบน Mac) มีการพัฒนาค่อนข้างดีและในขณะเดียวกันก็ใช้งานได้เป็นส่วนใหญ่
อย่างไรก็ตาม JetBrains Rider (2018 EAP ณ จุดนี้) เป็นสิ่งที่ดีกว่าและน่าเชื่อถือมากขึ้น (และตัวถอดรหัสที่รวมอยู่นั้นปลอดภัยกว่า) ซึ่งก็คือถ้าคุณพัฒนา. NET-Core บน Linux หรือ Mac MonoDevelop ไม่สนับสนุน Debug-StepThrough บน Linux ใน. NET Core แต่เนื่องจาก MS ไม่ได้อนุญาตให้ใช้ API การดีบัก API (ยกเว้น VisualStudio Mac ... ) อย่างไรก็ตามคุณสามารถใช้ดีบักเกอร์ Samsung สำหรับ. NET Coreผ่านส่วนขยายการดีบักเกอร์. NET Core สำหรับ Samsung Debugger สำหรับ MonoDevelop

ข้อจำกัดความรับผิดชอบ:
ฉันไม่ได้ใช้ Mac ดังนั้นฉันจึงไม่สามารถพูดได้ว่าสิ่งที่ฉันเขียนที่นี่ใช้กับ FreeBSD-Unix ที่ใช้ Mac ได้เช่นกัน ฉันกำลังอ้างถึง JetBrains Rider, Linux, MonoDevelop / VisualStudioMac / XamarinStudio และ. NET-Core รุ่น Linux (Debian / Ubuntu / Mint) นอกจากนี้ Apple กำลังใคร่ครวญการย้ายจากโปรเซสเซอร์ Intel ไปยังโปรเซสเซอร์ ARM (ARM-64?) ที่ผลิตด้วยตัวเองดังนั้นสิ่งที่ใช้กับ Mac ได้ในตอนนี้อาจไม่สามารถใช้กับ Mac ได้ในอนาคต (2020+)

นอกจากนี้เมื่อฉันเขียน "โมโนค่อนข้างไม่เสถียรและช้า" ความไม่เสถียรเกี่ยวข้องกับแอปพลิเคชัน WinFroms & WebForms โดยเฉพาะการใช้งานเว็บแอปพลิเคชันผ่าน fastcgi หรือ XSP (ในเวอร์ชัน 4.x ของโมโน) รวมถึง XML-serialization - การจัดการที่ไม่ซ้ำกันและค่อนข้างช้าเกี่ยวข้องกับ WinForms และการแสดงออกปกติโดยเฉพาะอย่างยิ่ง (ASP.NET-MVC ใช้การแสดงออกปกติสำหรับการกำหนดเส้นทางเช่นกัน)

เมื่อฉันเขียนเกี่ยวกับประสบการณ์ของฉันเกี่ยวกับ mono 2.x, 3.x และ 4.x นั่นก็ไม่ได้หมายความว่าปัญหาเหล่านี้ยังไม่ได้รับการแก้ไขในตอนนี้หรือตามเวลาที่คุณอ่านหรือถ้าเป็น ได้รับการแก้ไขแล้วในขณะนี้ว่าไม่สามารถมีการถดถอยได้ในภายหลังที่จะแนะนำข้อบกพร่อง / คุณสมบัติเหล่านี้อีกครั้ง และไม่ได้หมายความว่าถ้าคุณฝัง mono-runtime คุณจะได้ผลลัพธ์เช่นเดียวกับเมื่อคุณใช้ runtime mono ของระบบ (dev) มันไม่ได้หมายความว่าการฝัง mono-runtime (ที่ใดก็ได้) นั้นไม่จำเป็น

สิ่งที่ไม่จำเป็นต้องหมายความว่าโมโนนั้นไม่เหมาะสำหรับ iOS หรือ Android หรือมีปัญหาแบบเดียวกัน ฉันไม่ได้ใช้โมโนบน Android หรือ IOS ดังนั้นฉันจึงไม่พูดอะไรเกี่ยวกับความเสถียรการใช้งานต้นทุนและประสิทธิภาพบนแพลตฟอร์มเหล่านี้ เห็นได้ชัดว่าถ้าคุณใช้. NET บน Android คุณจะต้องคำนึงถึงค่าใช้จ่ายอื่น ๆ เช่นน้ำหนัก xamarin เทียบกับต้นทุนและเวลาสำหรับการย้ายรหัสที่มีอยู่ไปยัง Java หนึ่งได้ยินเสียงโมโนบน Android และ IOS จะค่อนข้างดี เอาไปด้วยเม็ดเกลือ อย่าคาดหวังว่าการเข้ารหัสระบบเริ่มต้นจะเหมือนกันบน android / ios เทียบกับ Windows และอย่าคาดหวังว่าระบบไฟล์ android จะไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และอย่าคาดหวังว่าจะมีตัวอักษร windows ใด ๆ ปรากฏอยู่ .


6
@Tseng: อาใช่มันเป็น bs? คุณเคยเห็น Winforms Core หรือ WPF Core มาก่อนหรือไม่? ใช่โดยทางเทคนิคแล้วมันเป็นพอร์ตหลายแพลตฟอร์มของ. NET Framework และไม่มีส่วนเกี่ยวข้องกับ MVC แต่แอปพลิเคชันบนเว็บ (ASP.NET MVC) และแอปพลิเคชันคอนโซลเป็นสิ่งเดียวที่คุณสามารถทำได้กับ. NET Core ในขณะนี้ ... และใช่ MVC เพราะไม่มี WebForms Core นั่นคือสิ่งที่มันเป็นในขณะนี้ธรรมดาและเรียบง่าย แต่จริงคุณไม่ต้องใช้ MVC ในเว็บแอปพลิเคชันของคุณเพียงเพราะคุณใช้. NET Core คุณสามารถสร้างเว็บแอปพลิเคชันโดยไม่มี MVC แต่ SEO ที่ชาญฉลาดมันจะทำให้รู้สึกเล็กน้อยที่จะทำ
Stefan Steiger

16
การพูดว่า Mono นั้น "ค่อนข้างไม่เสถียรและช้า" จะไม่มีมูลความจริงถ้าไม่ผิดธรรมดา แต่นอกเหนือจากนั้นข้อมูลที่ดีที่นี่
Noldorin

65
คำตอบนี้ได้รับการวิจารณ์อย่างมากและมีการอ้างอิง ณ จุดเวลาจำนวนมาก
แม็กเคเล็บ

23
มันทำให้ฉันเห็นประโยคแรกของคำตอบที่มีคะแนนสูงผิดไปอย่างโจ๋งครึ่ม .NET Core ไม่ใช่ re-write ของเฟรมเวิร์ก ASP.NET MVC
JHo

6
@ stefan-steiger แม้กระทั่งการพูดว่า "ส่วนใหญ่" นั้นผิดทั้งหมดและไม่ได้มีจุดประสงค์ทั้งหมดของ. NET Core "อีกครั้ง"? แทนที่จะทำซ้ำตัวเองทำไมคุณไม่เปลี่ยนมัน?
JHo

51

ในโลก. NET มี CLR สองประเภทคือ CLR แบบ "เต็ม" และ Core CLRs และสิ่งเหล่านี้ค่อนข้างแตกต่างกัน

มีการปรับใช้ CLR "เต็ม" สองแบบคือ Microsoft native .NET CLR (สำหรับ Windows) และ Mono CLR (ซึ่งมีการใช้งานสำหรับ Windows, linux และ unix (Mac OS X และ FreeBSD)) CLR แบบเต็มคือทุกอย่างที่คุณต้องการ ดังนั้น CLR แบบ "เต็ม" จึงมีขนาดใหญ่

Core CLR อยู่ในมืออื่น ๆ จะถูกตัดลงและมีขนาดเล็กกว่ามาก เนื่องจากเป็นเพียงการใช้งานหลักพวกเขาไม่น่าจะมีทุกสิ่งที่คุณต้องการดังนั้นด้วย Core CLR ที่คุณเพิ่มชุดคุณลักษณะให้กับ CLR ที่ผลิตภัณฑ์ซอฟต์แวร์เฉพาะของคุณใช้โดยใช้ NuGet มีการใช้งาน Core CLR สำหรับ Windows, linux (หลากหลาย) และ unix (Mac OS X และ FreeBSD) ในการผสม Microsoft มีหรือกำลัง refactoring ไลบรารีเฟรมเวิร์ก. NET สำหรับ Core CLR ด้วยเพื่อให้สามารถพกพาได้ง่ายขึ้นสำหรับบริบทหลัก หากการปรากฏตัวของ mono บนระบบปฏิบัติการ * nix มันน่าแปลกใจหาก Core CLR สำหรับ * nix ไม่ได้รวมฐานรหัสโมโนไว้ แต่มีเพียงชุมชน Mono และ Microsoft เท่านั้นที่สามารถบอกเราได้อย่างแน่นอน

นอกจากนี้ฉันยังเห็นพ้องกับ Nico ใน Core CLRs นั้นใหม่ - เป็น RC2 ในขณะที่ฉันคิด ฉันจะไม่ขึ้นอยู่กับรหัสการผลิตเลย

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


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

@Panayiotis Hiripis: การดีบักการเบี่ยงเบนพฤติกรรมโมโน, จัดการกับเซิร์ฟเวอร์เว็บโมโนที่ไม่เสถียรและข้อยกเว้นที่ไม่ได้นำมาใช้รวมถึงค่าใช้จ่ายที่เกิดขึ้นเมื่อเซิร์ฟเวอร์โฮสติ้งล่มไม่เสถียรจะทำให้คุณเสียค่าใช้จ่าย แกน ถ้าฉันใช้เวลาฉันจะใช้เวลาอัปเดตเป็นเวอร์ชันที่ใหม่กว่าเร็วกว่าและดีกว่าการออกแบบมากกว่าที่จะแก้ไขข้อบกพร่องในเวอร์ชันเก่าและดูแลโครงการด้วยเทคโนโลยีดั้งเดิม การย้ายในเวลาจะช่วยให้คุณปวดหัวมากในภายหลัง ในบางช่วงเวลาคุณจะต้องย้ายพอร์ต ... TheSoonerYouMove, the LessYouPort ในภายหลัง
Stefan Steiger

มันคุ้มค่าที่จะได้เห็นความกลมกลืนที่เชื่อมโยงกับห้องสมุด mgt ครั้งหนึ่ง (ไม่นานมานี้!) เรามีสิ่งนี้เรียกว่านรกนรก มันเกิดขึ้นเพราะหลายสำเนาของ dlls (บางครั้งแตกต่างกัน) ได้รับการปล่อยตัวด้วยการใช้งานที่แตกต่างกัน Java ยังคงมีปัญหานี้ Microsoft พยายามแก้ไขปัญหานี้ด้วยการลงทะเบียน COM และ NET GAC ในภายหลัง . NET Core แนะนำมันอีกครั้ง วันหนึ่งเราทุกคนหมุนรอบ - หลังจากไม่กี่ปีของการล้อเล่นกับ DLLs และการใช้งานเราจะเกิดขึ้นอีกครั้งกับ: รีจิสทรี NuGet, Maven, Gradle - นี่เป็นเพียงวิธีการจัดการแทนที่จะแก้ไข
muszeo

13

คุณเลือกไม่เพียง แต่เส้นทางที่เป็นจริง แต่ยังเป็นหนึ่งในระบบนิเวศที่ดีที่สุดที่ได้รับการสนับสนุนอย่างมาก (เช่นแพลตฟอร์ม X) โดย MS ยังคุณควรพิจารณาประเด็นต่อไปนี้:

  • อัปเดต: เอกสารหลักเกี่ยวกับ. แพลตฟอร์มมาตรฐานสุทธิอยู่ที่นี่: https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md
  • อัปเดต: Mono 4.4.1 ปัจจุบันไม่สามารถเรียกใช้ Asp.Net core 1.0 RTM ล่าสุดได้
  • ถึงแม้ว่าโมโนจะมีคุณสมบัติที่สมบูรณ์กว่า แต่อนาคตยังไม่ชัดเจนเนื่องจาก MS เป็นเจ้าของมันมาหลายเดือนแล้วและเป็นงานที่ซ้ำซ้อนเพื่อสนับสนุน แต่ MS มุ่งมั่นที่จะ. Net Core และเดิมพันอย่างมาก
  • แม้ว่า. core net จะถูกปล่อยออกมา ตัวอย่างเช่น Nhibernate, Umbraco และอื่น ๆ ยังไม่สามารถเรียกใช้ผ่าน. Net core ได้ แต่พวกเขามีแผน
  • มีคุณสมบัติบางอย่างที่ขาดหายไปใน. Net Core เช่น System.Drawing คุณควรมองหาห้องสมุดบุคคลที่สาม
  • คุณควรใช้ nginx เป็นเซิร์ฟเวอร์หน้ากับ kestrelserver สำหรับแอป asp.net เนื่องจาก kestrelserver ยังไม่พร้อมสำหรับการผลิต ตัวอย่างเช่น HTTP / 2 ไม่ได้ใช้งาน

ฉันหวังว่ามันจะช่วย


มีเว็บเซิร์ฟเวอร์ชื่อหนึ่งjexusที่สามารถโฮสต์เว็บไซต์ ASP.NET บน linux ได้ ไซต์ส่วนบุคคลของฉันเขียนด้วย NancyFx (แต่เดิม ASP.NET MVC4) ทำงานอยู่
zwcloud

สัญลักษณ์แสดงหัวข้อที่สองไม่ถูกต้อง ขณะนี้ฉันกำลังจัดส่งแอปพลิเคชัน ASP.NET Core 1.0 บน Mono 4.4.0 และมีอยู่ตั้งแต่ beta8
Ben Collins

@zwcloud: ทำไมไม่ใช้ mono.xsp4 /4.5 กับ nginx ด้วยล่ะ ไม่จำเป็นต้องมี jexus จริงๆ
Stefan Steiger

9

.Net Core ไม่จำเป็นต้องใช้โมโนในแง่ของกรอบโมโน .Net Core เป็นเฟรมเวิร์กที่จะทำงานบนหลายแพลตฟอร์มรวมถึง Linux ข้อมูลอ้างอิงhttps://dotnet.github.io/ https://dotnet.github.io/

อย่างไรก็ตามแกน. Net สามารถใช้เฟรมเวิร์กโมโนได้ การอ้างอิงhttps://docs.asp.net/en/1.0.0-rc1/getting-started/choosing-the-right-dotnet.html (note rc1 documentatiopn ไม่มี rc2 ให้ใช้งาน) อย่างไรก็ตามmonoไม่ใช่กรอบการสนับสนุนของ Microsoft และ จะแนะนำให้ใช้เฟรมเวิร์กที่รองรับ

ตอนนี้เอนทิตีเฟรมเวิร์ก 7 จะถูกเรียกใช้Entity Framework Coreและพร้อมใช้งานบนหลายแพลตฟอร์มรวมถึง Linux การอ้างอิงhttps://github.com/aspnet/EntityFramework (ตรวจสอบแผนที่ถนน)

ขณะนี้ฉันกำลังใช้เฟรมเวิร์กทั้งสองนี้ แต่คุณต้องเข้าใจว่ามันยังอยู่ในขั้นตอนการคัดเลือกผู้สมัคร ( RC2เป็นเวอร์ชั่นปัจจุบัน) และผู้สมัครรุ่นเบต้า & รีลีสนั้นมีการเปลี่ยนแปลงครั้งใหญ่ที่มักจะจบลงด้วยการเกาหัวของคุณ

นี่คือการสอนเกี่ยวกับวิธีการติดตั้ง MVC .Net Core ลงใน Linux https://docs.asp.net/en/1.0.0-rc1/getting-started/installing-on-linux.html

ในที่สุดคุณก็มีเว็บเซิร์ฟเวอร์ให้เลือก (ที่ฉันสมมติว่าการfast cgiอ้างอิงนั้นมาจาก) โฮสต์แอปพลิเคชันของคุณบน Linux นี่คือจุดอ้างอิงสำหรับการติดตั้งกับสภาพแวดล้อม Linux https://docs.asp.net/en/1.0.0-rc1/publishing/linuxproduction.html

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


6
Microsoft เป็นเจ้าของ Xamarin ซึ่งพัฒนาระบบโมโน ดังนั้นทั้งโมโนและ. Net Core จึงได้รับการสนับสนุนโดย MS
Joel Coehoorn

@JoelCoehoorn ฉันเข้าใจว่า Microsoft เป็นเจ้าของ Xamarin แต่ไม่รู้เกี่ยวกับ Xamarin ที่เป็นเจ้าของ Mono อย่างไรก็ตามจาก docs docs.asp.net/en/1.0.0-rc1/getting-started/…จะระบุว่าไม่รองรับ Mono ไม่ใช่แพลตฟอร์มที่ Microsoft รองรับ อย่างไรก็ตามเป็นพื้นฐานที่ดีสำหรับการพัฒนาข้ามแพลตฟอร์มในขณะที่รองรับข้ามแพลตฟอร์มใน. NET Core ตอนนี้อาจผิดหรือล้าสมัย
นิโก้

@Nico ในเวลา RC1 Microsoft ยังไม่ได้ซื้อ Xamarin คุณสามารถตรวจสอบระยะเวลาสำหรับรายละเอียดเพิ่มเติมได้ที่corefx.strikingly.com
Lex Li

Microsoft ไม่รองรับ Mono MS สนับสนุนองค์กร Xamarin แต่พวกเขาไม่ได้ทำอะไรเพื่อโครงการโมโน
Kotauskas

7

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

  • API -. NET Core มี APIs เดียวกันแต่น้อยกว่านั้นมากมายเช่นเดียวกับ. NET Framework และด้วยแฟคตอริ่งที่แตกต่างกัน (ชื่อแอสเซมบลี
    แตกต่างกัน
    โดยทั่วไปแล้วความแตกต่างเหล่านี้ต้องการการเปลี่ยนแปลงแหล่งที่มาของพอร์ตเป็น. NET Core . NET Core ใช้. NET Standard Library API ซึ่งจะเติบโตเพื่อ
    รวมมากขึ้นของ. NET Framework BCL APIs เมื่อเวลาผ่านไป
  • ระบบย่อย -. NET Core ใช้ชุดย่อยของระบบย่อยใน. NET Framework โดยมีเป้าหมายของการใช้งานที่ง่ายขึ้นและ
    รูปแบบการเขียนโปรแกรม ตัวอย่างเช่นไม่
    รองรับCode Access Security (CAS) ในขณะที่รองรับการสะท้อนกลับ

หากคุณต้องการที่จะเปิดตัวบางสิ่งได้อย่างรวดเร็วไปกับ Mono เพราะมันเป็นผลิตภัณฑ์ที่เป็นผู้ใหญ่มากขึ้นในขณะนี้ (มิถุนายน 2016) แต่ถ้าคุณกำลังสร้างเว็บไซต์ระยะยาวฉันจะแนะนำ. NET Core ได้รับการสนับสนุนอย่างเป็นทางการจาก Microsoft และความแตกต่างใน API ที่สนับสนุนอาจหายไปในไม่ช้าโดยคำนึงถึงความพยายามของ Microsoft ในการพัฒนา. NET Core

เป้าหมายของฉันคือใช้ C #, LINQ, EF7, visual studio เพื่อสร้างเว็บไซต์ที่สามารถวิ่ง / โฮสต์ใน linux

เฟรมเวิร์ก Linq และ Entity รวมอยู่ใน. NET Coreดังนั้นคุณจึงปลอดภัยที่จะยิง


4

จะง่าย

Mono คือการใช้งานกรอบงาน Net สำหรับบุคคลที่สามสำหรับ Linux / Android / iOs

.Net Core เป็นการดำเนินการของ Microsoft ในแบบเดียวกัน

.Net Core คืออนาคต และโมโนจะตายในที่สุด ต้องบอกว่า. Net Core นั้นยังไม่โตพอ ฉันพยายามที่จะติดตั้งใช้งานกับ IBM Bluemix และต่อมาก็ทำให้ความคิดนั้นแย่ลง ลงเวลา (อาจจะ 1-2 ปี) ก็ควรจะดีกว่า


8
ดูเหมือนจะไม่เป็นเช่นนั้น แต่คุณกำลังระบุสมมติฐาน / ความคิดเห็นอย่างเป็นทางการนี่คืออนาคตของโมโน: mono-project.com/news/2016/11/29/mono-code-sharingดูเหมือนว่าพวกเขาจะ จะเก็บรักษาไว้เป็น. net core เป็นเพียงแค่ "core" เซตย่อยของเฟรมเวิร์กเต็มรูปแบบและโมโนจะยังคงเป็นเฟรมเวิร์กข้ามแพลตฟอร์มเท่านั้นแม้ว่าด้วยโค้ดมาตรฐาน. net สามารถแชร์กับโมโนและเฟรมเวิร์ก. net เต็มรูปแบบ การใช้งาน. net เช่นเดียวกันกับ. net core แน่นอน)
pqsk

-14

โดยสังเขป:

Mono = คอมไพเลอร์สำหรับ C #

Mono Develop = คอมไพเลอร์ + IDE

.Net Core = ASP Compiler

กรณีปัจจุบันสำหรับ. Net Core เป็นเว็บเท่านั้นที่ใช้มาตรฐาน winform แบบเปิดและการใช้ภาษาที่กว้างขึ้นในที่สุดก็อาจเป็นโรงไฟฟ้า dev นักฆ่าของ Microsoft เมื่อพิจารณาถึงการออกใบอนุญาต Java ล่าสุดของออราเคิล Microsoft มีช่วงเวลาที่น่าสนใจมาก


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