ข้อแตกต่างระหว่างประเภทโครงการ. NET Core และ. NET Class Class Library คืออะไร


814

ใน Visual Studio มีไลบรารีคลาสต่าง ๆ อย่างน้อย 3 ชนิดที่คุณสามารถสร้างได้:

  • ไลบรารีคลาส (.NET Framework)
  • ไลบรารีคลาส (มาตรฐาน. NET)
  • ไลบรารีคลาส (. NET Core)

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

ดังนั้นอะไรคือความแตกต่างระหว่างClass Library (. NET Standard)และClass Library (.NET Core)ทำไมทั้งคู่จึงมีอยู่และเมื่อใดเราจึงควรใช้อันอื่น


10
คุณพลาดหนึ่ง: Class Library (Portable) Core == framework,. NET Standard == แบบพกพา
ฮันส์แพสแทนท์

4
มีอยู่คนหนึ่งจาก Xamarin เกินไป แต่คนอื่น ๆ เหล่านี้จะไม่เพิ่มค่าใด ๆ กับคำถาม :)
จีจี้

7
พวกเขาทำ แนวคิดหลักคือพวกเขายอมแพ้กับวิธีพกพามันทรมานมากจาก n! ปัญหาเกี่ยวกับวิธีโปรไฟล์มากเกินไป ดังนั้นตอนนี้คุณมี 7 มาตรฐานให้เลือก ส่วนใหญ่ไม่ได้พกพาได้จริงในตอนนี้ :). NETCore ไม่ได้ทำโดยการยิงนานอาจใช้เวลาอีกสองปีในคลิปที่พวกเขากำลังจะไป
ฮันส์แพสแตนท์

12
OP กล่าวว่า "อย่างน้อย 3 ประเภท" โพสต์นั้นถูกต้อง
Dan Friedman

1
ฉันสับสนกับการตั้งชื่อคอร์ซึ่งไม่ใช่เซตย่อยหลักของทั้งเพลตมาตรฐานและเฟรมเวิร์ก นอกจากนี้เรายังเห็น ASP ที่เกี่ยวข้องกับ. Net Core เป็นประจำ นี่เป็นเรื่องที่สับสนเช่นกัน ...
Alexis Pautrot

คำตอบ:


611

เมื่อใดที่เราควรใช้อีกอันหนึ่ง?

การตัดสินใจเป็นการแลกเปลี่ยนระหว่างความเข้ากันได้และการเข้าถึง API

ใช้ไลบรารี. NET Standard เมื่อคุณต้องการเพิ่มจำนวนแอพที่จะเข้ากันได้กับไลบรารีของคุณและคุณก็โอเคกับการลดลงของพื้นที่ผิว. API API ที่ไลบรารีของคุณสามารถเข้าถึงได้

ใช้ไลบรารี. NET Core เมื่อคุณต้องการเพิ่มพื้นที่ผิว. NET API ที่ไลบรารีของคุณสามารถเข้าถึงได้และคุณก็ไม่เป็นไรที่อนุญาตให้แอป. NET Core เท่านั้นที่เข้ากันได้กับไลบรารีของคุณ

ตัวอย่างเช่นไลบรารีที่มีเป้าหมาย. NET Standard 1.3 จะเข้ากันได้กับแอพที่มีเป้าหมายใน. NET Framework 4.6,. NET Core 1.0, Universal Windows Platform 10.0 และแพลตฟอร์มอื่น ๆ ที่รองรับ. NET Standard 1.3 แม้ว่าไลบรารีจะไม่สามารถเข้าถึงบางส่วนของ. NET API ได้ ตัวอย่างเช่น Microsoft.NETCore.CoreCLRแพคเกจเข้ากันได้กับ. NET Core แต่ไม่ใช่กับ. NET Standard

อะไรคือความแตกต่างระหว่าง Class Library (.NET Standard) และ Class Library (.NET Core)

ส่วนเฟรมเวิร์กที่อิงตามแพ็กเกจอธิบายความแตกต่าง

ความเข้ากันได้: ไลบรารีที่เป้าหมาย. NET Standard จะทำงานในรันไทม์ที่สอดคล้องกับ. NET มาตรฐานใด ๆ เช่น. NET Core, .NET Framework, Mono / Xamarin ในทางกลับกันไลบรารีที่เป้าหมาย. NET Core สามารถทำงานได้บนรันไทม์. NET Core เท่านั้น

API พื้นที่ผิว: ห้องสมุด .NET มาตรฐานมาพร้อมกับทุกอย่างในNETStandard.Libraryขณะที่ห้องสมุด .NET Microsoft.NETCore.Appหลักมาพร้อมกับทุกอย่างใน ส่วนหลังมีไลบรารีเพิ่มเติมอีกประมาณ 20 แห่งซึ่งบางแห่งเราสามารถเพิ่มด้วยตนเองในไลบรารี. NET Standard ของเรา (เช่นSystem.Threading.Thread) และบางแห่งไม่สามารถทำงานร่วมกับ. NET Standard (เช่นMicrosoft.NETCore.CoreCLR)

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

ทำไมทั้งคู่จึงมีอยู่?

ไม่สนใจไลบรารีสักครู่เหตุผลที่ว่า. NET Standard นั้นมีไว้เพื่อการพกพา มันกำหนดชุดของ APIs ที่. NET แพลตฟอร์มตกลงที่จะใช้ แพลตฟอร์มใด ๆ ที่ใช้. NET Standard จะเข้ากันได้กับไลบรารีที่มีเป้าหมายที่. NET Standard หนึ่งในแพลตฟอร์มที่รองรับคือ. NET Core

กลับมาที่ไลบรารีเท็มเพลตไลบรารี. NET Standard มีอยู่เพื่อรันบนหลาย runtimes (ที่พื้นที่ผิวของ API) ในทางกลับกันเท็มเพลตไลบรารี. NET Core มีอยู่เพื่อเข้าถึงพื้นที่พื้นผิว API เพิ่มเติม (โดยมีค่าใช้จ่ายในการใช้งานร่วมกันได้) และเพื่อระบุแพลตฟอร์มที่จะสร้างไฟล์ปฏิบัติการ

นี่คือเมทริกซ์เชิงโต้ตอบที่แสดงว่า. NET Standard รองรับการปรับใช้. NET ใดและพื้นที่พื้นผิว API พร้อมใช้งานเท่าใด


2
คำตอบที่ดีมาก แม้ว่าจะมีคำถามเพิ่มเติม (เกี่ยวข้องกับคำถามนี้ : เหตุใดจึงมีรูปแบบแอปพลิเคชันที่จำเป็นในการเรียกใช้การทดสอบหน่วยในอดีตที่ผ่านมาเมื่อเราใช้ไลบรารีคลาสที่ไม่สามารถรันได้เพื่อจัดการชุดทดสอบ
Gigi

3
ฉันได้อัปเดตคำตอบสำหรับคำถามที่เชื่อมโยงแล้ว TL; DR; ในอดีตไลบรารีของชั้นเรียนได้กำหนดกรอบการทำงานเต็มรูปแบบซึ่งรวมถึงโมเดลแอปพลิเคชันด้วย
Shaun Luttin

คุณลืมครอบคลุม Class Library (.NET Framework) เข้ากันได้กับ. NET Standard และ. NET Core หรือไม่
โทมัส

8
แผนภาพนี้ช่วยฉันได้จริงๆ
jpaugh

1
@BerBar คำถามเดิมเกี่ยวกับความแตกต่างระหว่าง. NET Standard และ. NET Core นั่นเป็นเหตุผลที่ฉันละเว้นรายละเอียดข้ามแพลตฟอร์มเนื่องจากข้ามแพลตฟอร์มไม่แตกต่างกันระหว่าง Core และ Standard ฉันตั้งใจเก็บคำตอบไว้ที่คำถามเดิม
Shaun Luttin

396

.NET หลักห้องสมุด Classถูกสร้างขึ้นเมื่อ.NET มาตรฐาน ถ้าคุณต้องการที่จะใช้ห้องสมุดที่พกพาไปยัง. NET Framework , . NET CoreและXamarinเลือก. NET Standard Library

. NET Core จะใช้. NET Standard 2ในที่สุด (เช่นเดียวกับXamarinและ. NET Framework )

ดังนั้นจึงสามารถระบุ. NET Core , Xamarinและ. NET Frameworkเป็นรสชาติของ. NET Standard

หากต้องการพิสูจน์แอปพลิเคชันของคุณในอนาคตสำหรับการแบ่งปันและนำโค้ดกลับมาใช้ใหม่คุณควรใช้ไลบรารี. NET Standard แทน

ไมโครซอฟท์ยังแนะนำให้คุณใช้.NET มาตรฐานแทนClass ห้องสมุดแบบพกพา

ในการอ้างอิง MSDN เป็นแหล่งข้อมูลที่เชื่อถือได้. NET Standardมีวัตถุประสงค์เพื่อเป็นห้องสมุดหนึ่งสำหรับกฎเหล่านี้ทั้งหมด เมื่อรูปภาพมีค่าหนึ่งพันคำต่อไปนี้จะทำให้สิ่งต่าง ๆ ชัดเจนมาก:

1. สถานการณ์แอปพลิเคชันปัจจุบันของคุณ (แยกส่วน)

เช่นเดียวกับพวกเราส่วนใหญ่คุณอาจอยู่ในสถานการณ์ด้านล่าง: (. NET Framework, Xamarin และแอปพลิเคชั่น.

ป้อนคำอธิบายภาพที่นี่

2. ไลบรารีมาตรฐาน. NET จะเปิดใช้งานสำหรับคุณ (ความเข้ากันได้ข้ามเฟรมเวิร์ก)

การใช้. NET Standard Library อนุญาตให้ใช้รหัสร่วมกันในรสชาติที่แตกต่างกันทั้งหมด:

ห้องสมุดแห่งหนึ่งเพื่อปกครองพวกเขาทั้งหมด

สำหรับความอดทน:

  1. .NET Standardแก้ปัญหาการแชร์รหัสสำหรับนักพัฒนา. NET ในทุกแพลตฟอร์มโดยนำ APIs ทั้งหมดที่คุณคาดหวังและชื่นชอบในสภาพแวดล้อมที่คุณต้องการ: แอปพลิเคชันเดสก์ท็อปแอพมือถือ & เกมและบริการคลาวด์:
  2. .NET มาตรฐานเป็นชุดของ APIที่ทุกแพลตฟอร์ม .NET ต้องใช้ นี้เป็นหนึ่งเดียวแพลตฟอร์ม .NETและป้องกันการกระจายตัวในอนาคต
  3. .NET Standard 2.0จะดำเนินการโดย. NET Framework , NET หลักและXamarin สำหรับ. NET Coreจะเป็นการเพิ่ม API ที่มีอยู่จำนวนมากที่ได้รับการร้องขอ
  4. .NET Standard 2.0รวม shim ความเข้ากันได้สำหรับ. NET Frameworkไบนารีเพิ่มชุดของไลบรารีที่คุณสามารถอ้างอิงจากไลบรารี. NET มาตรฐานของคุณ
  5. . NET Standard จะแทนที่ Portable Class Libraries (PCLs)เป็นเรื่องราวเกี่ยวกับเครื่องมือสำหรับการสร้างไลบรารี. NET หลายแพลตฟอร์ม

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

แหล่งที่มา: MSDN: แนะนำ. NET Standard


2
ASP.NET Core นั้นถูกวางผิดเล็กน้อยในกราฟิกนั้นเนื่องจากสามารถใช้กับ. NET Framework แบบเต็มไม่เพียง แต่. NET Core เนื่องจากเป็นเป้าหมายมาตรฐาน. NET จริง ๆ
Neme

2
แต่คุณสามารถสร้างแอป ASP.NET Core ได้โดยใช้. NET Framework แบบเต็ม - ASP.NET Core นั้นเป็นของเลเยอร์เดียวกับ. NET Standard มันไม่ได้ถูก จำกัด เพียงแค่. NET Core
Neme

1
@Neme ประการแรกใช่. Net Core สามารถรวมไลบรารี. Net Framework แต่สูญเสียการใช้ซ้ำข้ามแพลตฟอร์ม (เฉพาะสำหรับ Windows - ไม่ใช่ * nix หรือ OSX หรือนำมาใช้ซ้ำใน Xamarin) สถานการณ์ที่ได้รับการตอบสนองเนื่องจากมีหลายคนที่ต้องการ & นำไลบรารีที่มีอยู่มาใช้ใหม่เขียนในกรอบเต็ม Net Framework โดยไม่สนใจผลประโยชน์ข้ามแพลตฟอร์ม (ระดับ OS และระดับ App-Model) ... หากคุณยังรู้สึกว่าฉัน ผิดบางทีคุณอาจโต้เถียงกับ Microsoft ผู้สร้างภาพเหล่านั้น ... :-)
user919426

3
ฉันไม่ได้พูดถึงการรวม. NET Core และ. NET Framework ประเด็นของฉันคือ ASP.NET Core ไม่ได้ขึ้นอยู่กับ. NET Core เลยแม้จะมีชื่อก็ตาม มันถูกเขียนเป็นไลบรารีที่มีเป้าหมายใน. NET Standard ดังนั้นคุณสามารถใช้ได้ทุกที่ที่คุณสามารถใช้. NET Standard ใช่พวกเขาทำผิดในภาพนั้น
Neme

2
@OgrishMan คุณไม่สามารถสร้างปฏิบัติการในสุทธิมาตรฐาน มันสามารถเป็น Class Library เท่านั้นที่สามารถอ้างอิงโดยรหัสการดำเนินการอื่น ๆ มันมีรันไทม์ไม่มี
user919426

91

ดังนั้นคำตอบสั้น ๆ ก็คือ:

IAnimal == .NetStandard (General)
ICat == .NetCore (Less General)
IDog == .NetFramework (Specific / oldest and has the most features)

26
@ Joe.wang ตามที่ฉันเห็นมันไม่ดีที่มันยุ่งความสัมพันธ์ระหว่าง. NET Core และ. NET Framework ถ้า. NET Core เป็นนกแล้ว. NET Framework จะไม่สามารถเป็นนกอินทรีได้ (บางทีแมวก็เหมาะกว่า)
Lex Li

8
@LexLi ถูกต้องโคลนนี้เป็นน้ำ .NET Framework ไม่ใช่ประเภทย่อยของ. NET Core
Eric Eskildsen

6
สิ่งนี้อาจดูค่อนข้างแฟนซี แต่ไม่ใช่ acurate
afr0

3
ความคิดเห็นดั้งเดิมโดย @Joe ฟังดูแม่นยำยิ่งขึ้น คำตอบที่แก้ไขโดยชุมชนทำให้เกิดความสับสน
Nandun

7
สุนัขมีคุณสมบัติมากกว่าแมว? Nop :)
hrzafer

71

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

ตัวอย่างเช่นมี API ที่แตกต่างกันในแอพ Universal Windows มากกว่าในโปรไฟล์ Windows "ปกติ" แม้แต่ใน Windows คุณอาจมีโปรไฟล์ "ลูกค้า" เทียบกับโปรไฟล์ "เต็ม" นอกจากนี้ยังมีการนำไปใช้งานอื่น ๆ (เช่นMono ) ที่มีห้องสมุดเป็นของตนเอง

.NET Standardเป็นข้อกำหนดสำหรับชุด API ไลบรารีและชุดประกอบที่ต้องพร้อมใช้งาน แอปที่เขียนขึ้นสำหรับ. NET Standard 1.0 ควรสามารถรวบรวมและเรียกใช้กับ Framework, Core, Mono และอื่น ๆ ทุกเวอร์ชันที่โฆษณาสนับสนุนคอลเลกชัน. NET Standard 1.0 ของไลบรารี สิ่งที่คล้ายกันนี้เป็นจริงสำหรับ. NET Standard 1.1, 1.5, 1.6, 2.0 เป็นต้นตราบใดที่รันไทม์ให้การสนับสนุนเวอร์ชันมาตรฐานที่กำหนดเป้าหมายโดยโปรแกรมของคุณโปรแกรมของคุณควรรันที่นั่น

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

ในทางกลับกันแอปที่กำหนดเป้าหมายที่ Standard ควรจะสามารถใช้ในสถานการณ์การปรับใช้ได้มากขึ้นเนื่องจากในทางทฤษฎีแล้วมันสามารถทำงานกับ Core, Framework, Mono และอื่น ๆ สำหรับโครงการห้องสมุดชั้นเรียนที่ต้องการการกระจายกว้าง . สำหรับโครงการห้องสมุดคลาสที่ใช้เพื่อวัตถุประสงค์ภายในเป็นส่วนใหญ่อาจไม่เป็นปัญหามากนัก

.NET Standard ยังมีประโยชน์ในสถานการณ์ที่ทีมผู้ดูแลระบบต้องการย้ายจาก ASP.NET บน Windows เป็น ASP.NET สำหรับ. NET Core บน Linux สำหรับเหตุผลด้านปรัชญาหรือต้นทุน แต่ทีมพัฒนาต้องการทำงานต่อไป NET Framework ใน Visual Studio บน Windows


1
ในขณะที่ภาพรวมที่ดีของ. NET Core และ. NET Standard คืออะไรคำตอบนี้ไม่สามารถตอบคำถามเกี่ยวกับไลบรารีคลาสที่กำหนดเป้าหมายแต่ละรายการได้
Gigi

6
หากนั่นคือเป้าหมายของคุณคำถามต้องถูกปิดเป็น "ไม่ชัดเจนสิ่งที่คุณถาม" เนื่องจากมักจะมีสถานการณ์ที่เฉพาะเจาะจงมากเกินไปที่จะเล่นในสภาพแวดล้อมของบุคคลที่เราเคยบอกคุณว่าจะทำอย่างไร หรือเป็น "Too Broad" ถ้าคุณถามถึงกรณีทั่วไป ทั้งหมดที่เราสามารถทำได้ที่นี่คือให้ข้อมูลเกี่ยวกับผลิตภัณฑ์เพื่อให้คุณสามารถแจ้งให้ทราบสำหรับการตัดสินใจของคุณเอง
Joel Coehoorn

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

29

.NET Framework และ. NET Core เป็นทั้งเฟรมเวิร์ก

. NET Standard เป็นมาตรฐาน (ในคำอื่น ๆ สเปค)

คุณสามารถสร้างโครงการที่ปฏิบัติการได้ (เช่นแอปพลิเคชันคอนโซลหรือแอปพลิเคชัน ASP.NET) ด้วย. NET Framework และ. NET Core แต่ไม่ได้ใช้กับ. NET Standard

ด้วย. NET Standard คุณสามารถสร้างโครงการไลบรารีคลาสที่ไม่สามารถดำเนินการแบบสแตนด์อโลนและควรอ้างอิงโดยโครงการ. NET Core อื่นหรือ. NET Framework


20

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

namespace Analogy
{
  // .NET Standard

interface INetStandard10
{
    void Primitives();
    void Reflection();
    void Tasks();
    void Xml();
    void Collections();
    void Linq();
}

interface INetStandard11 : INetStandard10
{
    void ConcurrentCollections();
    void LinqParallel();
    void Compression();
    void HttpClient();
}

interface INetStandard12 : INetStandard11
{
    void ThreadingTimer();
}

interface INetStandard13 : INetStandard12
{
    //.NET Standard 1.3 specific APIs
}

// And so on ...


// .NET Framework 

interface INetFramework45 : INetStandard11
{
    void FileSystem();
    void Console();
    void ThreadPool();
    void Crypto();
    void WebSockets();
    void Process();
    void Drawing();
    void SystemWeb();
    void WPF();
    void WindowsForms();
    void WCF();
}

interface INetFramework451 : INetFramework45, INetStandard12
{
    // .NET Framework 4.5.1 specific APIs
}

interface INetFramework452 : INetFramework451, INetStandard12
{
    // .NET Framework 4.5.2 specific APIs
}

interface INetFramework46 : INetFramework452, INetStandard13
{
    // .NET Framework 4.6 specific APIs
}

interface INetFramework461 : INetFramework46, INetStandard14
{
    // .NET Framework 4.6.1 specific APIs
}

interface INetFramework462 : INetFramework461, INetStandard15
{
    // .NET Framework 4.6.2 specific APIs
}

// .NET Core
interface INetCoreApp10 : INetStandard15
{
    // TODO: .NET Core 1.0 specific APIs
}
// Windows Universal Platform
interface IWindowsUniversalPlatform : INetStandard13
{
    void GPS();
    void Xaml();
}

// Xamarin 
interface IXamarinIOS : INetStandard15
{
    void AppleAPIs();
}

interface IXamarinAndroid : INetStandard15
{
    void GoogleAPIs();
}    
// Future platform

interface ISomeFuturePlatform : INetStandard13
{
    // A future platform chooses to implement a specific .NET Standard version.
    // All libraries that target that version are instantly compatible with this new
    // platform
}
}

แหล่ง


17

อีกวิธีหนึ่งในการอธิบายความแตกต่างอาจเกิดจากตัวอย่างในโลกแห่งความเป็นจริงเพราะมนุษย์ส่วนใหญ่จะใช้เครื่องมือและกรอบงานที่มีอยู่ (Xamarin, Unity และอื่น ๆ ) ในการทำงาน

ดังนั้นด้วย. NET Framework คุณมีเครื่องมือ. NET ทั้งหมดที่จะทำงานด้วย แต่คุณสามารถกำหนดเป้าหมายเฉพาะแอปพลิเคชัน Windows (UWP, Winforms, ASP.NET และอื่น ๆ ) ตั้งแต่. NET Framework ถูกปิดแหล่งที่มามีไม่มากที่จะทำเกี่ยวกับมัน

ด้วย. NET Core คุณมีเครื่องมือน้อยลง แต่คุณสามารถกำหนดเป้าหมายแพลตฟอร์มเดสก์ท็อปหลัก (Windows, Linux, Mac) สิ่งนี้มีประโยชน์เป็นพิเศษในแอปพลิเคชัน ASP.NET Core เนื่องจากคุณสามารถโฮสต์ Asp.net ใน Linux (ราคาโฮสติ้งราคาถูก) ตอนนี้. NET Core เปิดแหล่งที่มาเป็นไปได้ในทางเทคนิคในการพัฒนาห้องสมุดสำหรับแพลตฟอร์มอื่น ๆ แต่เนื่องจากไม่มีกรอบที่สนับสนุนฉันไม่คิดว่าเป็นความคิดที่ดี

ด้วย. NET Standard คุณจะมีเครื่องมือน้อยลง แต่คุณสามารถกำหนดเป้าหมายแพลตฟอร์มส่วนใหญ่ / ทั้งหมดได้ คุณสามารถกำหนดเป้าหมายมือถือด้วย Xamarin และคุณสามารถกำหนดเป้าหมายเกมคอนโซลด้วย Mono / Unity อัปเดต: นอกจากนี้ยังเป็นไปได้ที่จะกำหนดเป้าหมายเว็บไคลเอ็นต์ด้วยแพลตฟอร์ม UNO และ Blazor (แม้ว่าทั้งสองจะเป็นแบบทดสอบตอนนี้)

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

แชร์ทั้งเซิร์ฟเวอร์และไคลเอนต์:

  • ไลบรารี. NET Standard ที่จัดการกับโมเดลของแอ็พพลิเคชันของฉัน
  • ไลบรารี. NET Standard ที่จัดการการตรวจสอบความถูกต้องของข้อมูลที่ส่งโดยไคลเอนต์

เนื่องจากเป็นไลบรารี. NET Standard จึงสามารถใช้ในโครงการอื่น (ไคลเอนต์และเซิร์ฟเวอร์)

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

ฝั่งเซิร์ฟเวอร์ (Web API):

  • ไลบรารี. NET Standard (อาจเป็น Core ด้วย) ที่จัดการการเชื่อมต่อฐานข้อมูลทั้งหมด

  • โครงการ. NET Core ที่จัดการ Rest API และใช้ประโยชน์จากไลบรารีฐานข้อมูล

เนื่องจากได้รับการพัฒนาใน. NET Core ฉันสามารถโฮสต์แอปพลิเคชันบนเซิร์ฟเวอร์ Linux

ฝั่งไคลเอ็นต์ (MVVM พร้อม WPF + Xamarin.Forms Android / IOS):

  • ไลบรารี. NET Standard ที่จัดการการเชื่อมต่อไคลเอ็นต์ API

  • ไลบรารี. NET Standard ที่จัดการกับ ViewModels Logic ใช้ในทุกมุมมอง

  • แอ็พพลิเคชัน. NET Framework WPF ที่จัดการมุมมอง WPF สำหรับแอ็พพลิเคชัน windows อัปเดต: แอปพลิเคชั่น WPF สามารถเป็น. NET core ได้ในขณะนี้แม้ว่าจะใช้ได้เฉพาะกับ windows ในปัจจุบันเท่านั้น AvaloniaUI เป็นทางเลือกที่ดีสำหรับการสร้างแอพพลิเคชั่น Desktop GUI สำหรับแพลตฟอร์มเดสก์ท็อปอื่น ๆ

  • ไลบรารี. NET Standard ที่จัดการมุมมอง Xamarin Forms

  • โครงการ Xamarin Android และ Xamarin IOS

ดังนั้นคุณจะเห็นได้ว่ามีข้อได้เปรียบอย่างมากที่นี่ในฝั่งไคลเอ็นต์ของแอปพลิเคชันเนื่องจากฉันสามารถนำทั้งไลบรารี. NET Standard (Client API และ ViewModels) มาใช้ใหม่และเพียงแค่สร้างมุมมองโดยไม่มีเหตุผลสำหรับแอปพลิเคชัน WPF, Xamarin และ IOS


2
ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าเพราะมันรวมเอาโลกแห่งความจริง
J Weezy

12

. NET Standard: คิดว่ามันเป็นห้องสมุดมาตรฐานขนาดใหญ่ เมื่อใช้สิ่งนี้เป็นการพึ่งพาคุณสามารถสร้างไลบรารี (.DLLs) เท่านั้นไม่ใช่ไฟล์ที่เรียกทำงานได้ ไลบรารีที่สร้างด้วย. NET มาตรฐานเป็นการพึ่งพาสามารถเพิ่มลงใน Xamarin.Android, Xamarin.iOS, โครงการ. NET Core Windows / OS X / Linux

.NET Core: คิดว่ามันเป็นความต่อเนื่องของ. NET Framework เก่าเพียงแค่มันเป็น opensource และบางสิ่งยังไม่ได้รับการดำเนินการและอื่น ๆ ได้เลิกใช้แล้ว มันขยายมาตรฐาน. NET ด้วยฟังก์ชั่นพิเศษ แต่จะทำงานบนเดสก์ท็อปเท่านั้น เมื่อเพิ่มสิ่งนี้เป็นการพึ่งพาคุณสามารถสร้างแอปพลิเคชั่นที่รันได้บน Windows, Linux และ OS X (แม้ว่าคอนโซลสำหรับตอนนี้จะไม่มี GUIs) ดังนั้น. NET Core =. NET มาตรฐาน + สก์ท็อปเฉพาะสิ่ง

นอกจากนี้UWPจะใช้มันและASP.NET Coreใหม่ก็ใช้เป็นเครื่องมืออ้างอิงเช่นกัน


8

. NET Standard มีอยู่เป็นหลักในการปรับปรุงการแบ่งปันรหัสและทำให้ APIs พร้อมใช้งานในแต่ละการใช้งาน. NET ที่สอดคล้องกันมากขึ้น

ในขณะที่สร้างไลบรารีเราสามารถมีเป้าหมายเป็น. NET Standard 2.0 เพื่อให้ไลบรารีที่สร้างขึ้นสามารถทำงานร่วมกับ. NET Framework รุ่นต่างๆรวมถึง. NET Core, Monoและอื่น ๆ


2

คำตอบข้างต้นอาจอธิบายความเข้าใจที่ดีที่สุดเกี่ยวกับความแตกต่างระหว่างคอร์เน็ตมาตรฐานมาตรฐานและโครงข่ายเน็ตเวิร์กดังนั้นฉันแค่ต้องการแบ่งปันประสบการณ์ของฉันเมื่อเลือกสิ่งนี้

ในโครงการที่คุณต้องการผสมระหว่าง. NET Framework, .NET Core และ. NET Standard ตัวอย่างเช่นในขณะที่เราสร้างระบบด้วย. NET Core 1.0 ไม่มีการสนับสนุนสำหรับ Window Services ที่โฮสต์ด้วย. net core

เหตุผลต่อไปคือเรากำลังใช้งานรายงานที่ไม่รองรับ. NET Core ดังนั้นเราต้องการสร้างไลบรารีโครงสร้างพื้นฐานที่สามารถใช้ได้ทั้ง. NET Core (asp.net core) และ Windows Service and Reporting (.NET Framework) -> นั่นคือเหตุผลที่เราเลือก. NET Standard สำหรับไลบรารีประเภทนี้ การเลือก. NET มาตรฐานหมายความว่าคุณต้องพิจารณาอย่างรอบคอบทุกคลาสในไลบรารีควรจะง่ายและข้าม. NET (แกน, กรอบ, มาตรฐาน)

สรุป:

  • .NET Standard สำหรับไลบรารีโครงสร้างพื้นฐานและการแชร์ทั่วไป lib นี้สามารถอ้างอิงได้โดย. NET Framework และ. NET Core
  • .NET Framework สำหรับเทคโนโลยีที่ไม่รองรับเช่น Active Report, Window Services (ตอนนี้รองรับ. NET 3.0)
  • .NET Core สำหรับ ASP.NET Core แน่นอน

Microsoft เพิ่งประกาศ. NET 5: https://devblogs.microsoft.com/dotnet/introducing-net-5/


@Gigi โปรดอ่านคำตอบของฉันอย่างระมัดระวังฉันบอกว่ามันเป็นตอนที่. NET Core ในรุ่น 1.0 และในกรณีนี้เราต้องการออกแบบโซลูชันเพื่อรวมทั้ง. NET core และ. NET Framework ASP.NET Core รองรับ. NET Framework จาก 2.0 ข้างต้น คำตอบของฉันคือเรื่องราวเมื่อคุณต้องจัดการกับ. NET หลายเวอร์ชัน ดังนั้นฉันจึงไม่เข้าใจว่าทำไมคุณมี downvote เมื่อคุณไม่เข้าใจสถานการณ์อย่างถูกต้อง
toannm

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

0

ต้องพัฒนาแบบฟอร์ม Windows . NET Framework , ASP.NET และ WPF โดยใช้ไลบรารี. NET Framework

แอปพลิเคชัน. NET Standard Xamarin, IOs และ MAC OSx จะต้องไม่เบี่ยงเบนโดยใช้ไลบรารี. NET Standard


แพลตฟอร์ม. NET Core Universal Windows (UWP) และ Linux ต้องได้รับการพัฒนาโดยใช้ไลบรารี. NET Core API ถูกนำไปใช้ใน C ++ และคุณสามารถใช้ C ++, VB.NET, C #, F # และ Javascript languages.NET


0

. Net Core Class Library สร้างขึ้นตามมาตรฐาน. Net หากคุณต้องการติดตั้งไลบรารี่ที่พกพาไปยัง. Net Framework, .Net Core และ Xamarin ให้เลือก. Net Standard Library


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